É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 glDepthFunc
de 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.