Mapping y Hammer

Skybox custom, niebla y color correction para mapas de GMod

Ajusta el cielo, la niebla y el aspecto de un mapa: skybox 2D y texturas de cielo custom, env_fog_controller con Far Z, color_correction y exposición HDR.

El cielo de un mapa lo defines con dos cosas: caras con el material tools/toolsskybox y el nombre del cielo en Map > Map Properties. La niebla viene de un env_fog_controller, el ambiente de color de un color_correction con un archivo .raw, y la exposición HDR la limita un env_tonemap_controller. El color de la niebla, la luz del sol y la color correction tienen que encajar con la imagen del cielo.

Cómo funciona el skybox 2D

Las caras con tools/toolsskybox son ventanas al cielo. El motor dibuja ahí un cubo de seis imágenes que siempre rodea a la cámara y, por eso, parece estar infinitamente lejos. Qué imágenes son lo determina el campo «SkyBox Texture Name» (skyname) de las Map Properties. El valor por defecto es sky_day01_01.

Solo escribes el nombre base, sin skybox/ y sin extensión. El motor añade un sufijo por cada lado del cubo y busca el material en materials/skybox/:

SufijoLadoEjemplo
uparribamaterials/skybox/sky_day01_01up.vmt
dnabajomaterials/skybox/sky_day01_01dn.vmt
lf, rtizquierda, derechasky_day01_01lf.vmt, sky_day01_01rt.vmt
ft, bkdelante, detrássky_day01_01ft.vmt, sky_day01_01bk.vmt

La mayoría de los cielos de Half-Life 2 vienen además como un conjunto para HDR con _hdr delante del sufijo, por ejemplo sky_day01_01_hdrup. Dentro del juego, sv_skyname muestra el nombre actual. El decorado lejano hecho de geometría se construye con el skybox 3D, que se dibuja delante de esta imagen.

Usar un cielo de serie o añadir el tuyo

GMod trae los cielos de Half-Life 2 (sky_day01_01 a sky_day03_06, sky_borealis01, sky_wasteland02) y uno ajustable: con el nombre de cielo painted y la entity env_skypaint ajustas directamente los colores del cielo. Para estos cielos no tienes que empaquetar nada.

Un cielo custom consta de seis archivos VTF y seis archivos VMT en materials/skybox/. El VMT de un cielo de serie es la mejor plantilla:

"UnlitGeneric"
{
	"$basetexture" "skybox/mymap_skyup"
	"$nofog" "1"
	"$ignorez" "1"
}
  • $nofog excluye el cielo de la niebla, $ignorez lo dibuja sin prueba de profundidad para que quede detrás de toda la geometría.
  • Las texturas de cielo de serie llevan los flags de VTF Clamp S, Clamp T, No Mipmap y No LOD. Sin clamp pueden verse costuras en las aristas del cubo.
  • El conjunto HDR de las plantillas usa el shader sky con $hdrcompressedtexture. Prueba expresamente un cielo custom sin conjunto HDR en un mapa HDR.

Los doce archivos van en el BSP, consulta Empaquetar contenido custom en un BSP. Cómo se crean los archivos VTF y VMT se explica en Crear texturas custom con VTF y VMT.

Ajustar la luz al cielo

El cielo es solo una imagen, la luz viene del light_environment. Pitch y Yaw tienen que coincidir con la posición del sol en la imagen, «Brightness and Color» lleva el color de la luz del sol y «Ambient Color and Brightness» el color del cielo. Para los cielos de Valve, la Valve Developer Community mantiene una Sky List con valores de los mapas oficiales. Las entities en sí se explican en la guía de iluminación de Source Engine.

Niebla con env_fog_controller

KeyvaluePor defectoEfecto
Fog Enable (fogenable)NoActiva la niebla, de lo contrario una entity nueva no muestra nada
Fog Start (fogstart)500Distancia a la que empieza la niebla
Fog End (fogend)2000Distancia a la que se alcanza la densidad máxima
Fog Max Density (fogmaxdensity)1Densidad máxima de 0 a 1
Primary Fog Color (fogcolor)255 255 255Color de la niebla
Far Z Clip Plane (farz)-1Distancia a partir de la cual ya no se dibuja nada. -1 significa desactivado

La niebla por sí sola no ahorra rendimiento, solo tiñe las superficies lejanas. La ganancia viene de Far Z: lo que queda más allá no se dibuja, y VVIS lee el valor del env_fog_controller y lo usa para limitar la visibilidad ya al compilar. Según el FGD, Far Z debería ser mayor que Fog End, y Fog Max Density debería ser 1, porque de lo contrario se ve el vacío que hay detrás. Hay más opciones en Optimizar el rendimiento de un mapa de GMod.

Como el cielo queda excluido de la niebla, los edificios totalmente cubiertos de niebla destacan contra él como formas planas de un solo color. Así que elige un color de niebla que encaje con el horizonte.

El skybox 3D tiene su propia niebla en la sky_camera, con los mismos campos de color, inicio, fin y densidad. El propio motor convierte el inicio y el fin a la escala del skybox, así que escribes los mismos números que en el env_fog_controller. Si hay varios controllers, el FGD da prioridad al que tiene el flag «Master». Una niebla distinta por zona la activa en GMod un fog_volume.

Ambiente de color con color_correction

Una color correction es una tabla de consulta que sustituye cada color de la imagen final por otro. Viene como un archivo .raw de unos 96 KB y se crea dentro del juego:

  1. Coloca un color_correction en el mapa y deja «Lookup Table Filename» vacío por ahora.
  2. Carga el mapa, activa sv_cheats 1 y escribe colorcorrectionui.
  3. Crea filtros en la ventana de la herramienta y ajústalos. Mientras lo haces, quédate dentro del alcance de la entity.
  4. Guarda el resultado como .raw y pon el archivo en materials/colorcorrection/.
  5. Escribe la ruta en la entity, recompila y empaqueta el archivo en el BSP.

El nombre de archivo (filename) es relativo a la carpeta del juego e incluye la extensión, por ejemplo materials/colorcorrection/mymap.raw. La whitelist de gmad solo permite archivos .raw en materials/colorcorrection/.

«Lookup Falloff Start Distance» vale 0 por defecto y «Lookup Falloff End Distance», 200. Así, la corrección solo actúa a menos de 200 unidades de la entity y se atenúa hacia fuera. Para todo el mapa, escribe -1 en los dos campos. «Maximum Weight» controla la intensidad, y con Enable y Disable cambias de un ambiente a otro.

Exposición HDR con env_tonemap_controller

En un mapa HDR, el motor ajusta la exposición de forma continua: oscurece las escenas claras y aclara las oscuras. El env_tonemap_controller le pone límites. En el FGD de GMod no tiene keyvalues para esto, lo controlas mediante inputs, lo más sencillo desde un logic_auto:

My Output    Target Entity   Target Input         Parameter
OnMapSpawn   tonemap         SetAutoExposureMin   0.8
OnMapSpawn   tonemap         SetAutoExposureMax   1.6
OnMapSpawn   tonemap         SetBloomScale        0.5

Los números son valores de ejemplo. SetAutoExposureMin limita cuánto se oscurece una escena clara, SetAutoExposureMax cuánto se aclara una oscura. En el Source SDK los valores iniciales son 0.5 y 2. SetBloomScale controla el resplandor alrededor de las superficies claras. SetTonemapRate está pensado para fijar la velocidad del ajuste, pero según la Valve Developer Community solo tenía efecto en el modo de un jugador en las ramas del motor anteriores a CS:GO. Así que compruébalo en un servidor. Los inputs SetTonemapScale y BlendTonemapScale están comentados en el FGD de GMod, con la nota de que nunca funcionaron. La estructura de los outputs se muestra en Inputs y outputs en Hammer.

Problemas típicos

SíntomaCausaSolución
El cielo está negro o muestra un patrón de cuadros rosas y negrosNombre mal escrito, archivos sin empaquetar o sufijos incorrectosBusca Unable to load sky en la consola, revisa sv_skyname, empaqueta
El cielo no encaja con el skybox 3DLa niebla de la sky_camera difiere de la del env_fog_controllerIguala color, inicio, fin y densidad
La geometría se corta de forma visible a lo lejosFar Z menor que Fog End, densidad por debajo de 1 o niebla desactivadaFar Z por encima de Fog End, densidad 1, «Fog Enable» en Yes
La color correction solo funciona en un puntoEl falloff sigue en 0 y 200Pon los dos valores en -1
A los jugadores les falta la color correction.raw sin empaquetar, ruta sin extensión, o desactivada por el jugadorRevisa la ruta, empaqueta, contrasta con mat_colorcorrection 0 y 1

La color correction y el HDR son opciones gráficas, y un servidor puede bloquear la color correction mediante sv_allow_color_correction. Así que el mapa tiene que seguir siendo legible sin ninguna de las dos. Si los materiales del cielo y el .raw están en el pakfile se ve en el Map Scanner, que enumera los archivos incrustados.

Preguntas frecuentes

¿Puede un mapa tener varios cielos?

No. El nombre del cielo es una propiedad de todo el mapa y se aplica allí donde se vea tools/toolsskybox. Los ambientes distintos por zona se consiguen con niebla, color correction y luz.

¿Qué tamaño deben tener las texturas de cielo?

El cielo por defecto sky_day01_01 usa 512 × 512 píxeles para la cara superior y 512 × 256 para los lados. Las texturas más grandes son más nítidas, pero con seis lados cuentan seis veces en el tamaño de archivo del mapa.

¿Por qué otros jugadores ven mi mapa distinto?

Casi siempre por las opciones gráficas. Con HDR se aplican los lightmaps HDR, el tonemapping y el cielo HDR, sin HDR la versión LDR. Si la color correction está desactivada, falta tu ambiente de color. Prueba las dos variantes antes de publicar.