Pregunta

Aquí están mis configuraciones para opengl, en caso de que sean importantes:

glViewport(0,0,w,h); //w=800, h=600
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

Durante un tiempo pensé que los planos de recorte se aplicarán a cualquier cosa para la que gl_Position.z esté fuera de -1 a 1. Pero incluso cuando fuerzo gl_Position.z a un número constante en el sombreador:

gl_Position.z = -0.01;

¡Todavía hay un almacenamiento en búfer z correcto y un recorte basado en gl_Position.w!Entonces, ¿cuáles son las reglas?

¿Fue útil?

Solución

El valor de gl_Position está en lo que OpenGL llama "espacio de clip". Es un sistema de coordenadas homogéneo . En particular, las extensiones XYZ del espacio de clip son [-W, + W]. Entonces, cada vértice está en su propio espacio de clip.

No estoy seguro de qué quiere decir exactamente con "cuáles son las reglas". El espacio de clip gl_Position se recorta contra el área de visualización en un espacio homogéneo. Por tanto, se recortan en la región [-W, + W] de cada vértice. Es difícil imaginar eso en un espacio proyectivo homogéneo, pero las matemáticas funcionan, así que no importa.

Después de eso, los vértices recortados se transforman en un espacio de coordenadas de dispositivo normalizado (NDC). Esto significa dividir el XYZ del espacio del clip por W. Todos estos vértices están en el rango [-1, 1].

A partir de ahí, se produce la transformación de la ventana gráfica. Los parámetros de glViewport escalan los vértices desde el espacio NDC [-1, 1] hasta la región de la ventana gráfica. Esto transforma los puntos en el espacio de la ventana; es en el espacio de la ventana donde se rasterizan.

El XY del espacio de la ventana está controlado por glViewport. Los valores Z para el espacio de la ventana están controlados por glDepthRange. El rango de profundidad predeterminado es un valor cercano de 0 y un valor lejano de 1 (ADVERTENCIA: los planos cercano / lejano de la matriz de perspectiva no tienen nada en común con el rango de profundidad. No confunda los dos). Así que asigna el [-1, 1] de la Z en el espacio NDC a [cerca, lejos] en el espacio de la ventana.

Esas son "las reglas".

Otros consejos

Usas glClearDepth (1.0f); glEnable (GL_DEPTH_TEST); glDepthFunc (GL_LEQUAL);

Depth Buffer tiene un valor entre 0 y 1 (profundidad máxima), use eligió GL_LEQUAL, lo que significa que todo se dibujará en la pantalla ya que el valor de profundidad sería menor o igual a 1.

Para mayor claridad, visite: http://www.zeuscmd.com/tutorials/opengl/11-Depth.php

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top