tutorial triangle texture shadertoy shaders learnopengl descargar opengl glsl shader

opengl - triangle - GLSL gl_FragCoord.z Cálculo y configuración gl_FragDepth



texture in opengl c++ (2)

Para futuras referencias, el código clave es:

float far=gl_DepthRange.far; float near=gl_DepthRange.near; vec4 eye_space_pos = gl_ModelViewMatrix * /*something*/ vec4 clip_space_pos = gl_ProjectionMatrix * eye_space_pos; float ndc_depth = clip_space_pos.z / clip_space_pos.w; float depth = (((far-near) * ndc_depth) + near + far) / 2.0; gl_FragDepth = depth;

Entonces, tengo un impostor (la geometría real es un cubo, posiblemente recortado, y la geometría del impostor es una esponja Menger) y necesito calcular su profundidad.

Puedo calcular la cantidad a compensar en el espacio mundial con bastante facilidad. Desafortunadamente, he pasado horas fallando en perturbar la profundidad con él.

Los únicos resultados correctos que puedo obtener son cuando voy:

gl_FragDepth = gl_FragCoord.z

Básicamente, necesito saber cómo se calcula gl_FragCoord.z ​​para poder:

  • Tome la transformación inversa de gl_FragCoord.z ​​al espacio ocular
  • Añadir la perturbación de profundidad.
  • Transforme esta profundidad perturbada de nuevo en el mismo espacio que el gl_FragCoord.z ​​original.

Pido disculpas si esto parece una pregunta duplicada; Hay una serie de otras publicaciones aquí que tratan cosas similares. Sin embargo, después de implementar todos ellos, ninguno funciona correctamente. En lugar de intentar elegir uno para obtener ayuda, en este punto, estoy pidiendo un código completo que lo haga. Debería ser sólo unas pocas líneas.


Para otra referencia futura, esta es la misma fórmula dada por imallett, que estaba funcionando para mí en una aplicación OpenGL 4.0:

vec4 v_clip_coord = modelview_projection * vec4(v_position, 1.0); float f_ndc_depth = v_clip_coord.z / v_clip_coord.w; gl_FragDepth = (1.0 - 0.0) * 0.5 * f_ndc_depth + (1.0 + 0.0) * 0.5;

Aquí, modelview_projection es 4x4 modelview-projection matrix y v_position es la posición en el espacio de objetos del píxel que se procesa (en mi caso, calculado por un raymarcher).

La ecuación proviene de la sección de coordenadas de la ventana de este manual . Tenga en cuenta que en mi código, cerca es 0.0 y lejos es 1.0 , que son los valores predeterminados de gl_DepthRange . Tenga en cuenta que gl_DepthRange no es lo mismo que la distancia cercana / lejana en la fórmula para la matriz de proyección en perspectiva . El único truco es usar 0.0 y 1.0 (o gl_DepthRange en caso de que realmente necesite cambiarlo), he estado luchando durante una hora con el otro rango de profundidad, pero eso ya está "horneado" en mi (perspectiva) matriz de proyección .

Tenga en cuenta que de esta manera, la ecuación realmente contiene solo una única multiplicación por una constante ( (far - near) / 2 ) y una sola suma de otra constante ( (far + near) / 2 ). Compare eso para multiplicar, agregue y divida (posiblemente convertido a un multiplicador por un compilador de optimización) que se requiere en el código de imallett.