Estoy leyendo un impresionante tutorial de OpenGL. Es realmente genial, confía en mí. El tema en el que estoy actualmente es Z-buffer. Además de explicar de qué se trata, el autor menciona que podemos realizar pruebas de profundidad personalizadas, como GL_LESS, GL_ALWAYS, etc. También explica que el significado real de los valores de profundidad (cuál es superior y cuál no) también puede ser personalizado Entiendo hasta ahora. Y luego el autor dice algo increíble:
El rango zNear puede ser mayor que el rango zFar; si es así, entonces los valores del espacio de la ventana se invertirán, en términos de lo que constituye lo más cercano o lo más lejano del espectador.
Anteriormente, se dijo que el valor Z del espacio de la ventana de 0 es el más cercano y 1 es el más lejano. Sin embargo, si nuestros valores Z del espacio de recorte fueran negados, la profundidad de 1 sería la más cercana a la vista y la profundidad de 0 sería la más lejana. Sin embargo, si cambiamos la dirección de la prueba de profundidad (GL_LESS a GL_GREATER, etc.), obtenemos exactamente el mismo resultado. Así que en realidad es solo una convención. De hecho, cambiar el signo de Z y la prueba de profundidad alguna vez fue una optimización de rendimiento vital para muchos juegos.
Si entiendo correctamente, en cuanto al rendimiento, cambiar el signo de Z y la prueba de profundidad no es más que cambiar un <
comparación con un >
comparación. Entonces, si entiendo correctamente y el autor no está mintiendo o inventando cosas, entonces cambiando <
a >
solía ser una optimización vital para muchos juegos.
¿El autor está inventando cosas, estoy malinterpretando algo, o es realmente el caso que una vez <
era más lento (vitalmentecomo dice el autor) que >
?
¡Gracias por aclarar este asunto tan curioso!
Descargo de responsabilidad: Soy plenamente consciente de que la complejidad del algoritmo es la fuente principal de optimizaciones. Además, sospecho que hoy en día definitivamente no haría ninguna diferencia y no estoy pidiendo esto para optimizar nada. Soy extremadamente, dolorosamente, tal vez prohibitivamente curioso.
(a < b) es idéntico a (b > a) por lo que no hay absolutamente ninguna necesidad de implementar ambas operaciones de comparación en el hardware. La diferencia en el rendimiento es el resultado de lo que sucede como resultado de la operación de comparación. Este es un camino largo y sinuoso para explicar todos los efectos secundarios, pero aquí hay algunos consejos. Los juegos solían llenar el búfer de profundidad para evitar un procesamiento de fragmentos más costoso para los fragmentos que fallaron la prueba de profundidad. Quake solía dividir el rango de profundidad en dos mitades para evitar borrar el búfer de cuadros porque el juego siempre llenaba cada píxel en la pantalla y así sucesivamente.
– t0rakka
27 de diciembre de 2017 a las 14:24
Aquí está el versión archivada del tutorial de OpenGL al que se hace referencia. Sin embargo, parece que no puedo encontrar el fragmento citado, tal vez lo eliminaron.
– Fons
8 de julio de 2018 a las 13:03