¿Idoneidad de la niebla terrestre utilizando quads alfa en capas?

16

Un enfoque en capas usaría una serie de quads masivos con textura alfa dispuestos paralelos al suelo, que se cruzan con toda la geometría del terreno intermedio, para proporcionar la ilusión de niebla terrestre de manera bastante efectiva desde arriba, mirando hacia abajo, y algo menos eficaz cuando está dentro de la niebla y mirando hacia el horizonte (ver imagen a continuación).

Alternativamente, un enfoque basado principalmente en sombreadores calcularía la densidad en función de la distancia de visión en el sustrato de niebla terrestre y generaría el valor del fragmento en función de eso.

Sin tener que evaluar el rendimiento de cada enfoque por mí mismo , me gustaría escuchar primero las experiencias de los demás (¡no las especulaciones!) Sobre qué tipo de impacto en el rendimiento es probable que tenga el enfoque de textura alfa en capas. Pregunto específicamente debido a los impactos frecuentemente citados del sobregiro (no estoy seguro de cuán limitado es el índice de llenado de su sistema de escritorio promedio). Una lista de juegos que utilizan este enfoque, particularmente juegos antiguos, sería inmensamente útil: si esto fuera viable en hardware pre DX9 / OpenGL2, es probable que funcione bien para mí.

Una gran pregunta es con respecto a este tipo de efecto:

ingrese la descripción de la imagen aquí

(El crédito de la imagen va a Lume de lume.com)

Observe cómo la gradación de niebla vertical es continua / suave. OTOH, usando capas cuádruples texturizadas, solo puedo suponer que las capas serían muy obvias al caminar a través de ellas: cuanto más escasas fueran, más obvio sería. Esto contrasta con el lugar donde los planos de niebla están alineados para enfrentar al jugador en cada cuadro, donde esta aspereza sería mucho menos obvia.

Ingeniero
fuente
1
¿Por qué querrías usar capas cuádruples alfa para esto? El "enfoque de sombreado pesado" no solo es más preciso, sino que tampoco es conocido por ser lento .
Nicol Bolas
1
@StephanvandenHeuvel Claro, pero eso es niebla basada en la distancia, alineada con el espacio de vista. Niebla no alineada con el suelo. ¿Correcto?
Ingeniero
1
@NickWiggill Sí, tienes razón.
Stephan van den Heuvel
1
IIRC, la Wii tenía niebla alineada con el suelo en su tubería (semi) fija. Aparentemente, la glFogCoordextensión en OpenGL heredado permitió hacer eso también . Aunque suena limitado: está basado en tierra o en distancia.
Laurent Couvidou
1
Quake 3 hizo algo similar a esto, utilizando un enfoque de tubería fija que funcionó con GL1.1. La gran preocupación que tengo es que la tasa de relleno / sobregiro puede acumularse mucho, pero probablemente valga la pena descargar el código fuente Q3 y revisar su implementación; Es posible que no haga exactamente lo mismo, pero al menos puede ayudarlo a tomar una decisión.
Maximus Minimus

Respuestas:

15

Como has pedido experiencias, aquí están las mías.

En los días en que estaba programando juegos de PS2, el enfoque de "quads alfa en capas" era una forma en que a menudo implementamos la niebla. Ocasionalmente como niebla terrestre, pero mucho más comúnmente como niebla de pantalla completa. Y funcionó bien en cualquier caso. Entonces sí, era viable en los días previos al sombreador de fragmentos.

Especie de. El problema, como ha notado, era que si desea una niebla suave como la que se ve en la captura de pantalla, necesita un número bastante absurdo de quads alfa.

En la PS2, generalmente podríamos permitirnos entre tres y cinco capas. Que definitivamente parecía "paredes" de niebla flotando frente a ti. Más que eso y la velocidad de relleno comenzó a matar nuestra velocidad de fotogramas.

Normalmente, estos cuádriceps se dibujarían a distancias fijas frente a la cámara, por lo que nunca tendría la situación que menciona, "caminando" a través de uno de ellos. Por otro lado, al usar esas distancias fijas, todo lo demás en el mundo hacepasar a través de esos planos a medida que el jugador se mueve, lo cual es una falla gráfica bastante obvia. Casi todos lo hicieron en ese entonces, pero ahora no sería aceptable (a menos que lo hicieras por razones estilísticas). (Excepción: algunas personas calcularon los valores de niebla como parte del equivalente de PS2 de un sombreador de vértices. Eso funcionó y fue mucho más rápido, pero requería que sus modelos estuvieran altamente teselados. No se podían tener paredes largas, por ejemplo, porque la niebla era solo se calculó en las esquinas de la pared y luego se extendió por toda la cara de la pared.La pared parecía completamente empañada si estaba parado justo al lado de su centro, por ejemplo, ya que solo estaba probando los niveles de niebla en su puntos finales)

Tenga en cuenta que si coloca quads de niebla estáticamente en el mundo (como menciona como una posibilidad), entonces no podrá obtener la apariencia de niebla extremadamente suave, como en la imagen que proporciona, habrá superposiciones extrañas entre quads adyacentes según la orientación del espectador. Esas superposiciones pueden aparecer como rayas o trapecios (si los quads no tienen textura) o como grupos (si tienen textura).

Pero supongamos que estamos usando quads anchos y orientados a la pantalla para hacer esta niebla en el suelo y hacer algunos cálculos sobre cómo hacer una niebla realmente suave usando este método, en terreno plano, con una cámara mirando hacia adelante, esa es nuestra situación ideal. . Supongamos una resolución HD: 1920x1080, lo que pone nuestro horizonte en la línea de exploración 540. Supongamos también que tenemos visibilidad hasta el horizonte (es decir, suponiendo que la niebla no alcanza la opacidad total antes de llegar al horizonte). Con un quad de niebla que comienza y uno que se detiene en cada línea de exploración (para obtener una niebla suave), necesitamos (540 * 2 ==) 1080 quads de niebla. Cada uno de estos 1080 quads de niebla cubrirá toda la extensión horizontal de la pantalla,

Hagamos una estimación baja y digamos que, en promedio, un avión de niebla cubrirá aproximadamente 300 filas de píxeles. Los más cercanos cubrirán menos, los más lejanos cubrirán menos, las filas del medio cubrirán mucho más.

Con esa estimación, obtenemos (1920x300 ==) 576,000 píxeles siendo tocados por el quad de niebla promedio. En total, eso es (576,000 * 1080 ==) 622,080,000 píxeles tocados en total para todo el efecto de "niebla suave a través de la representación de un montón de geometría translúcida". Y ese número aumentará para las personas que se ejecutan en una resolución más alta. Y lo que es más, obtenemos el mismo número de pruebas contra el z-buffer, y casi el mismo número de operaciones de mezcla de píxeles, ya que todas estas capas transparentes se dibujan una sobre la otra una y otra vez. Eso es muchos píxeles.

Y ese es el mejor de los casos: obtendrá mucha más cobertura de pantalla de los quads de niebla si el usuario mira hacia abajo o se agacha.

Tenga en cuenta que dado que estamos superponiendo 1080 quads, probablemente queremos un valor alfa de aproximadamente (1.0 / 1080 ~ =) 0.0009 establecido en cada uno, de modo que nuestra niebla alcance la opacidad total si mira a través de todos los 1080 quads. (Podríamos ir más alto que eso, pero este es el valor asumiendo que queremos extender el rango tanto como sea posible). Tenga en cuenta que este valor no se puede representar como el componente alfa de un valor de color de 32 bits (256 * 0.0009 ~ = 0.237 y, por lo tanto, se redondeará a 0 si lo intenta). Deberá proporcionar el valor de 0.0009 a OpenGL como un valor de coma flotante para que esto funcione. (También tenga en cuenta que en realidad no querrá establecer este mismo valor en cada uno, aunque definimos que queríamos que comenzara un quad y que terminara en cada línea de exploración debajo del horizonte para darnos una niebla suave,

También tenga en cuenta que las mezclas de niebla no funcionarán correctamente usando este enfoque, como lo harían con un sombreador moderno: en lugar de obtener un cálculo de "mezcla entre el color del objeto base y el color de la niebla usando este porcentaje", obtendrá 1080 cálculos de "mezcla entre el color hasta ahora y el color de la niebla por el porcentaje de niebla". Lo que significa que la niebla afectará a los objetos después de una caída logarítmica. (Es decir, un objeto afectado por 20 quads de niebla aparecerá menos del doble de empañado que algo afectado por 10 quads de niebla, porque los primeros quads de niebla tienen más impacto en la operación de mezcla).

Todo lo cual es para decir: Por favor, use un sombreador de fragmentos.

No realmente. Es más simple y más barato, más rápido y más rápido de implementar y menos propenso a errores, y le permite volver a hacer su juego y es mejor en todas las formas posibles. Lo hubiéramos hecho totalmente en la era de PS2 si fuera incluso vagamente posible en ese momento.

Trevor Powell
fuente
1
+1 para una respuesta integral basada en la experiencia del mundo real.
concept3d
3
Hace un año y un mes cuando escribí esta pregunta, todavía estaba dispuesto a jugar pollo con tasas de llenado. Ahora optaría por una textura 3D gruesa para representar volúmenes de niebla en el suelo con densidades en constante cambio determinadas, por ejemplo, por el ruido perlin 3D, y luego usaría esto como base para los efectos de espacio en la pantalla, tal como lo ha sugerido.
Ingeniero