OPTIMIZACION: FOGHULL

 

 

 

El FOGHULL es una carácterística de las últimas versiones del compilador q3map2 (Ydnar) que se utiliza para mejorar el rendimiento del motor gráfico, y consiste en utilizar una técnica que se llama Farplane Distance Clipping (Plano lejano de recorte de distancia) en la que el motor gráfico irá descartando el dibujado de los polígonos a medida que la vista del jugador se va alejando más allá de una distancia preestablecida, esta distancia es lo que se llama “distance clipping” o distancia de recorte y se establece mediante la clave “fogclip” en la entidad worldspawn.

 

Pero debido a que los motores basados en Quake III, la distancia de recorte (distance clipping) no está nativamente implementada si se utiliza la característica “Farplane Distance Clipping” entonces el jugador  vería el efecto “pasillo de espejos” desde la franja donde comienzan a no renderizarse los polígonos, debido a que no se está dibujando nada en el Frame Buffer. Para solucionar esto, se usa una especie de cubo (plano cercano) que rodea a jugador, cuya distancia al jugador se establece mediante otra clave en la entidad worldspawn, llamada “_farplanedist”. Este skybox sustituye a la geometría que no se está dibujando. Pero este cubo no puede se visible al jugador,  y por eso, se usa niebla para ocultar todo lo que está más allá de la máxima distancia hasta la que el jugador puede ver. El  shader de niebla foghull se establece mediante la clave “_fog” dentro de la entidad worldspawn.

La técnica “Foghull” se utiliza más bien en grandes extensiones de terreno con pocos brushes estructurales

Vamos a ver un ejemplo:

 

1.- CREAR UN MAPA

En este caso usaremos un terreno para usar nuestro “foghull”. Le he incluido modelos MD3 para comprobar en el juego si se renderizan o no con la característica “foghull”.


 

 

2.-CREAR LAS TEXTURAS DEL SKYBOX (máscara de la niebla).

 

Antes de nada, debemos crear 6 texturas que usaremos para el skybox, que debe tener el mismo color que la niebla que vamos a usar, de lo contrario crearía un mal efecto de niebla. Dichas texturas tienen que llamarse de la siguiente forma:

 

<mitextura>_bk.jpg ->atrás

<mitextura>_ft.jpg  ->frente

<mitextura>_lf.jpg  ->izquierda

<mitextura>_rt.jpg  ->derecha

<mitextura>_up.jpg ->arriba

<mitextura>_dn.jpg ->abajo

 

 

cielofh_bk.jpg

*cielofh_ft.jpg

* cielofh_lf.jpg

* cielofh_rt.jpg

* cielofh_up.jpg

* cielofh_dn.jpg

 

 

3.- CREAR LOS SHADERS

Luego tenemos que crear el shader correspondiente al skybox así como el shader de la niebla.

EL shader del skybox debe contener por lo menos estas líneas:

 

01

textures/megabit_foghull/cielofoghull

02

{

03

surfaceparm nolightmap

04

surfaceparm nonsolid

05

surfaceparm noimpact

06

surfaceparm nodlight

07

q3map_backsplash 0 0

08

surfaceparm sky

09

nocompress

10

nopicmip

11

q3map_lightrgb 1.0 1.0 1.0

12

// q3map_sun 1.0 1.0 1.0 500 140 20  (opcional)

13

q3map_lightmapFilterRadius 0 8

14

q3map_skylight 60 16  

15

skyparms textures/foghull/cielofh 0 –

16

}

 

Linea 01: indica el path y el nombre del shader para el skybox. En este caso hemos creado un subdirectorio en el directorio texturas llamado “megabit_fognull”. Nuestro shader para el cielo foghull se llamará “cielofoghull”.

Linea 06: el juego tratará esta textura como si fuera cielo.

Linea 15: (skyparms <farbox> <cloudheight> <nearbox>), esta palabra clave indica que se usarán para el skybox las 6 texturas cuyo nombre base es “cielofh”.Debe existir una textura para cada lado interno del cubo skybox, y con la denominación arriba indicada. El valor 0 que le sigue, indica la curvatura del cielo; para los “foghull” debe usarse 0. El siguiente valor “-“, indica que se ignora la existencia de una segundo cubo skybox a modo de canal alpha.

 

El mapa debe estar diseñado de forma que el jugador no llegue a tocar el skybox.

 

El shader de niebla debe contener estas líneas:

 

01

textures/megabit_foghull/nieblafoghull

02

{

03

surfaceparm nonsolid

04

surfaceparm trans

05

surfaceparm fog

06

fogParms ( 0.1725 0.1764 0.2078 ) 1024

07

}

 

Linea 01: indica el path y el nombre del shader para la niebla.

Línea 05: esta textura será tratada en el juego como niebla.

Línea 06: son los parámetros para la niebla.

              a) Los números que están entre paréntesis son los valores R G B normalizados correspondientes al color de la niebla. Normalizado quiere decir, que debes dividir cada valor normal R G y B entre 255, para obtener un valor en un rango de 0 a 1. El valor RGB de un color lo puedes ver en un programa de retoque fotográfico como puede ser photoshop. Para eso abrimos una de las 6 imágenes diseñadas para el skybox y calculamos los valores RGB.

 

 

Los valores RGB normalizados para el color de nuestra niebla los hallaríamos así:

R 213 -----------44/255à 0.1725

G 213 ---------- 45/255-> 0,1764

B 213 ---------- 53/255-> 0,2078

 

NOTA IMPORTANTE: los valores RGB del color de la niebla deben ser los mismos que los valores RGB del color de la textura utilizada en el skybox.

 

                  b) El valor que sigue a los paréntesis es la “distancia a opaco”, es decir, la distancia medida en unidades de juego, desde la vista del jugador, a partir de la cual la niebla se vuelve completamente opaca.

 

 

Crearemos un archivo .shader en el directorio scripts al que en este caso llamamos foghull.shader en el que incluiremos los shaders skybox y de niebla para nuestro “foghull” (además de otras texturas de nuestro mapa). Acuerdate de añadir el nombre del archivo shader en el “shaderlist.txt”.

 

 

4.- CONFIGURAR LA ENTIDAD WORLDSPAWN

 

El último paso es añadir dos claves (con sus valores) necesarias para activar la característica “foghull”. Estas claves son _fog_farplanedist y fogclip.

_fog: esta clave debe apuntar a la ruta y el nombre del shader que hemos creado para la niebla. Por ejemplo, en nuestro caso, nuestro shader de niebla está localizado en “textures/megabit_foghull/nieblafoghull” por lo tanto el valor de la clave _fog en la entidad worldspawn sería “texturas/megabit_foghull/cielofoghull”.

 

_farplanedist: es la distancia a partir de la cual la niebla es completamente opaca. Lo que hace es crear un plano cercano a la vista del jugador, que rellena el espacio que va dejando la geometría que no se renderiza (fogclip). De no existir ese plano  se vería el efecto “pasillo de espejos”. El valor de esta clave debe coincidir con la “distancia a opaco” del shader de niebla.

 

fogclip: con esta clave se establece la distancia a partir de la cual el motor gráfico no renderizará los triángulos. Dicha eliminación de la geometría se oculta mediante la niebla.

 

El valor que se establezca en _farplanedist deberá ser igual o ligeramente menor que el valor de  “fogclip”, para que la niebla pueda ocultar la visualización de la desaparición de los triángulos.

 

En nuestro ejemplo la “_farplanedist” es igual a 1024, por lo tanto “fogclip” debe establecerse a 1024 o con un valor ligeramente mayor que 1024.

 

Para añadir estas dos claves y sus valores a la entidad “Wordspawn” seleccionamos un brush en el mapa y presionamos “N”.

 

 

Solo falta compilar el mapa y probarlo en el juego:

 

 

Si ejecutamos /r_showtris 2 desde la consola veremos que triángulos está procesando el motor gráfico. Si el tractor está en el espacio comprendido entre el jugador y el valor de “fogclip” entonces se dibujará.

 

 

Pero a medida que el jugador se aleja llega un punto en el que el tractor coincide con el valor de “fogclip” que en nuestro caso vale 1024. A partir de ahí veremos que los triángulos van desapareciendo.

 

 

 

Descargar ejemplo del tutorial: foghull.pk3

 

 

 
 
 
 

 Última actualización: domingo, 18 de mayo de 2008.  

mEg@bIt