En OpenGL, ¿cómo puedo descubrir el rango de profundidad de un búfer de profundidad?

11

Estoy haciendo una aplicación de representación de múltiples pasos GL para iOS. La primera pasada representa una textura de búfer de profundidad. La segunda pasada utiliza los valores en el búfer de profundidad para controlar la aplicación de un sombreador de fragmentos. Quiero reescalar los valores en el búfer de profundidad a algo útil, pero antes de poder hacerlo necesito saber el rango de valores de profundidad de los valores del búfer de profundidad. ¿Cómo hago esto?

dugla
fuente

Respuestas:

10

El rango de los valores escritos en el búfer de profundidad es lo que quiera que sean. Por lo general, caen en el rango de 0 a 1. El valor real que se escribe en el búfer de profundidad se calcula durante la transformación de la ventana gráfica, en función del valor Z del vértice en el espacio NDC (después de la perspectiva dividir por w en el espacio del clip).

El valor de profundidad de NDC (Z, después de que la perspectiva se divida por W) se escala por la porción de profundidad de la transformación de la vista (que lleva sus coordenadas X e Y a un espacio de coordenadas que asociaría con píxeles en la ventana), y luego se escala por (2^n-1)- que debe interpretarse como "dos a la potencia de n" - nes la precisión de bits del búfer de profundidad. El valor resultante se escribe en el búfer de profundidad.

OpenGL divide la definición de la matriz de transformación de la ventana gráfica en llamadas glViewport y glDepthRange . glDepthRange es lo que controla el factor de escala responsable de determinar el rango de profundidad sobre el que está preguntando. Puede llamar a glGetFloatv con el GL_DEPTH_RANGEselector para recuperar el rango actual. Esto le permitirá hacer uso del rango sin suponer que es 0 a 1 (aunque el 99.9% del tiempo, en la práctica, nadie lo cambia).

Lectura adicional, si desea obtener información sobre cómo reconstruir las matemáticas para seguir el valor Z desde el espacio del ojo hasta el búfer de profundidad.


fuente
Le daré este a Josh por todo el material de referencia adicional del estudio y un consejo sobre la planitud triangular. Me inclino a hacer un truco donde se colocan planos de recorte cercanos / lejanos para que coincidan exactamente con la extensión z de la geometría que estoy renderizando para que el mapa de profundidad tenga buenos valores. ¿Qué estoy haciendo? Quiero crear interesantes efectos de desenfoque específicos de la ubicación durante el pase n. ° 2 según lo que haya en el mapa de profundidad del pase n. ° 1.
Dugla 03 de
7

Los valores en el buffer de profundidad siempre están en el rango entre 0-1. Cero es que el fragmento renderizado está en profundidad en el plano cercano y 1 es que el fragmento está en profundidad en el plano lejano. Y todo entre eso.

Si desea conocer la profundidad real en el espacio mundial, es fácil calcularlo desde el búfer de profundidad.

depth = nearPlane + ( farPlane - nearPlane ) * depthBufferValue;

Y es por eso que especifica los planos cercanos y lejanos en su matriz de proyección, para obtener más precisión del búfer de profundidad.

También tenga en cuenta la diferencia entre la profundidad y la distancia cuando utilice los valores del búfer de profundidad.

Notabene
fuente
@notebene. Casi ahí. Quiero reescalar el rango de valores en el buffer de profundidad para que sea exactamente 0 -> 1. Entonces, si los valores de profundidad min / max representados son .25 / .75 quiero (valor de profundidad - .25) / (. 75 - .25). Por lo tanto, hay una manera de descubrir el min / max de la depthbuffer siguiente pase 1 y el uso que reescalar durante pase 2.
dugla
1
@dugla: dado que está renderizando triángulos, que son planos, los valores mínimos y máximos de profundidad se asociarán con los vértices mínimo y máximo en la escena. Si conoce estos dos, puede transformarlos manualmente a lo largo de la tubería y sabrá los valores mínimos y máximos que escribiría en el búfer de profundidad. Esto es posiblemente más fácil que renderizar, luego leer todo el búfer de profundidad e iterarlo.