• Miércoles 20 de Noviembre de 2024, 10:13

Autor Tema:  Niebla En Doom 3  (Leído 1583 veces)

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Niebla En Doom 3
« en: Sábado 28 de Febrero de 2004, 17:18 »
0
Hola a todos.

Estaba navegando por internet, viendo información sobre Doom 3, cuando vi un screenshot del juego que me llamó increiblemente la atención.

Sorprendentemente no fue uno lleno de efectos y explosiones, ni geometría increiblemente detallada, ni cosas de este estilo. Fue uno relativamente simple, con unos monstruillos que parecen cabezas con patas, y niebla.

Hasta aqui todo normal, pero lo sorprendente es que combinaba stencil shadow volumes con niebla! :blink:

El algoritmo que genera las sombras obtiene como salida, por decirlo de manera simple, una máscara que indica qué partes de la imagen en pantalla están a la sombra de una luz (el lugar donde esto se guarda es el stencil buffer). Teniendo esto, lo que se hace es oscurecer en la imagen final las partes que el stencil buffer indica que están a la sombra. De esta manera no se sabe a qué distancia están las sombras en el espacio, pero sí se sabe qué parte de la imagen final está a la sombra. Por ello, en todas las demos que combinan este tipo de sombras con niebla se puede ver cómo cuando la sombra se aleja dentro de la niebla no se ve afectada por ésta y permanece completamente negra (se puede ver esto en el ejemplo ShadowVolume para Direct3D, en el SDK de DirectX).

Sin embargo, en el screenshot que vi esto no sucede. Hay niebla y las sombras que hay lejos se ven afectadas por ésta. Así, llega mi pregunta:

¿Cómo hace Doom 3 para combinar stencil shadow volumes y niebla?

Lo único que se me ocurre es hacer una última pasada, después de pintar las sombras, generando a mano la niebla a partir de los valores que haya en el z-buffer, pero me da la sensación de que esto será muy ineficiente. ¿Hay algún método que no conozca? ¿Se trata de alguna extensión de las nuevas tarjetas? ¿Se optimizaría con un FragmentProgram?

Uff, sobredosis de preguntas ;) . Espero que alguien me pueda responder a esto. :lol:

Un saludo.

Ruben3d

PD: Adjunto la imagen, claro.
No me deja usar el tag IMG  :angry:
http://common.ziffdavisinternet.com/util_g...&i=50697,00.jpg
y el link a la web donde está:
http://www.computergaming.com/slideshow_vi...00&po=36,00.asp

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Niebla En Doom 3
« Respuesta #1 en: Domingo 29 de Febrero de 2004, 17:17 »
0
Habría que ver el juego en acción. Una simple pantalla capturada puede ser muy engañosa.

Si el stencil buffer puede almacenar números de 8 bits (para usarlo como superficie para un efecto alpha) y se pudiera agregar un parámetro al algorimo que genera la máscara en el stencil buffer para indicarle que tan "oscura" será la máscara se podría evitar una segunda pasada.

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Niebla En Doom 3
« Respuesta #2 en: Domingo 29 de Febrero de 2004, 20:48 »
0
Hola.

En el stencil buffer no se guarda qué parte está a la sombra de la manera normal, con una imagen en escala de grises. Mientras se está ejecutando el algoritmo se usa como si fuera un acumulador, sumando 1 si se da cierta condición y restando 1 si de da cierta otra en cada píxel concreto. De esta manera, cuando el algoritmo ha terminado, si el valor de la celda de cada píxel es diferente de cero quiere decir que está a la sombra y si es igual a cero quiere decir que está iluminado. Así, es como si la máscara fuera de un bit de profundidad de color, por lo que sólo hay dos estados: iluminado y a la sombra. Por ello no se puede hacer lo que me dices.

Se me olvidó decir que en Doom 3 se hace una pasada por cada luz, para que los lugares en donde se proyecten dos o más sombras estén más oscuros. ¿Esto generaría aún más sobrecarga al generar la niebla?

También se me olvidó decir que Doom 3 usa OpenGL, aunque mencioné un ejemplo de DirectX para que se viera el efecto.

En esta dirección está bastante bien explicado cómo funciona el algoritmo:
The Theory of Stencil Shadow Volumes

Un saludo.

Ruben3d