Fuera de límites en juegos AAA

21

En muchos títulos AAA comunes (juegos de motor fuente especialmente), cuando el jugador llega a un área 'no atendida', como fuera de los límites o sin recortes debajo del mapa; se produce un efecto extraño en la pantalla (¿desgarro del búfer?).

Se puede describir como similar al rastro de las ventanas que Windows XP puede dejar detrás de una ventana que se arrastra mientras hay un sistema bloqueado.

¿Solo puedo postular que los desarrolladores no borran el búfer de color al actualizar la pantalla?

¿Es eso correcto? Si es así, ¿por qué?

caviar desacelerado
fuente
8
Por cierto, esto a menudo se llama el efecto "Salón de los Espejos" o HOM.
Nathan Reed

Respuestas:

35

Érase una vez, la limpieza de los tampones de color y profundidad en realidad tomó tiempo. Hacer un claro significaba que la tarjeta gráfica tendría que recorrer cada píxel del framebuffer y escribirle un valor.

Debido a esto, los desarrolladores de juegos descubrieron que sería más eficiente simplemente asumir que cada píxel se renderizaría nuevamente. Desarrollaron muchas técnicas para hacer esto.

El búfer de color es el más fácil de ignorar. Menos fácil es el búfer de profundidad, ya que estaría contaminado con datos antiguos. Entonces, lo que hicieron fue simple.

En el cuadro 0, se representarían con un glDepthRange(o el equivalente D3D) de (0, 0.5), y utilizarían un glDepthFuncde GL_LESS(o GL_LEQUAL). Esto significa que el valor de profundidad más lejano que obtendría en el búfer de profundidad es 0.5. Entonces, el valor más grande en el búfer de profundidad al final del cuadro 0 es 0.5 (suponiendo que escribiste en cada píxel).

En el cuadro 1, cambiarían el rango de profundidad a (1, 0.5). Observe que en este caso, el valor de profundidad cercana es mayor que la profundidad lejana. Pero también cambiarían la función de profundidad a GL_GREATER(o GL_GEQUAL), lo que invierte el significado de la prueba de profundidad. Debido a que el valor más grande en el búfer de profundidad es 0.5, todo lo que escriba tendrá un valor mayor que este. Como se invirtió la prueba de profundidad, esto significa efectivamente que todo lo que se escribió en el fotograma 0 ahora está más lejos que cualquier cosa que pueda escribirse en el fotograma 1. Al final del fotograma 1, el valor más pequeño en el búfer de profundidad ahora es 0.5.

Y luego repiten.

En cualquier hardware fabricado desde alrededor de 2003, esto ya no es una optimización. De hecho, es una optimización negativa . Borrar el búfer de profundidad en realidad hace que el hardware sea más rápido . No realmente.

Básicamente, lo que sucede es que borrar los buffers no escribe nada. Almacenan algunos bits en los cachés de la GPU que le permiten al sistema saber a qué color / profundidad han sido eliminados. Cuando el sistema intenta escribir en una línea de caché del framebuffer, no se molesta en leer lo que hay allí, porque ya sabe que es un campo en blanco del color claro / valor de profundidad. Si intenta mezclar con lo que está allí o hacer una prueba de profundidad, nuevamente, no necesita leer: sabe qué valor mezclar / probar con / contra.

Entonces, cada primera lectura / modificación / escritura que realiza en cada línea de caché después de un borrado es básicamente una escritura. Es libre .

Además, tener un búfer de profundidad irregular puede funcionar contra las optimizaciones Hyper-Z / Hierarchial-Z / any Z-culling en el hardware. Sí, su escena funcionará contra esos eventualmente a medida que agregue detalles. Pero si su búfer de profundidad es irregular a partir de representaciones anteriores, incluso si esos objetos de fondo están en el fondo, puede afectar la eficiencia de las técnicas de eliminación de Z. Y eso no va a ayudar al rendimiento.

Por lo tanto, nunca debes hacer esta técnica de inversión de profundidad en los juegos modernos.

Nota: Jari hace un buen punto en las arquitecturas de representación basadas en mosaicos (como se encuentra en la mayoría de las plataformas móviles). No despejar la profundidad puede hacer que las cosas también sean desagradables.

Nicol Bolas
fuente
¿Su última declaración implica no alternar nunca el búfer de profundidad o? Gran respuesta.
deceleratedcaviar
1
@Daniel Sí. Aclaré mi publicación.
Nicol Bolas
3
Además, omitir las arquitecturas binning claras (como la mayoría de los chips OpenGL ES) causa una pérdida masiva de rendimiento, ya que el chip gráfico no puede hacer suposiciones sobre el estado del búfer de color.
Jari Komppa
5

Sí, tiene razón en que el búfer posterior no se está borrando.

El motivo es porque (principalmente) es más rápido usar un sombreador personalizado que haga ping-pong en los valores de profundidad en direcciones opuestas en cada cuadro y confíe en el hecho de que su juego siempre muestra cada píxel en la pantalla.

Entonces, por un costo cero, ahorra un búfer claro por cuadro.

Patrick Hughes
fuente
1
No sé sobre ping-pong de profundidad; Todos los motores con los que estoy familiarizado borran el búfer de profundidad / plantilla de cada cuadro. Pero aparte de eso, sí, si el juego representa todos los píxeles (como debería), no necesita borrar el búfer de color.
Nathan Reed
¿Podría dar un ejemplo para el sombreador? Buena respuesta de lo contrario.
deceleratedcaviar
1
Me doy cuenta de que estás preguntando acerca de los motores recientes, leer el comentario de @ NathanReed es cuántos motores solo para PC funcionan ahora. El giro del búfer Z es una técnica más antigua, veré si puedo encontrar una referencia. Los motores de consola también borrarán en su mayor parte todo el búfer de color, incluso un píxel que muestre el efecto HOM que Nathan nombró fallará un título y lo obligará a pasar por las presentaciones nuevamente.
Patrick Hughes