Entonces, tengo un impostor (la geometría real es un cubo, posiblemente recortado, y la geometría impostora es una esponja Menger) y necesito calcular su profundidad.GLSL gl_FragCoord.z Cálculo y configuración gl_FragDepth
Puedo calcular la cantidad para compensar en el espacio mundial con bastante facilidad. Desafortunadamente, he pasado horas sin perturbar la profundidad con él.
Los únicos resultados correctos yo puede conseguir son cuando voy:
gl_FragDepth = gl_FragCoord.z
Básicamente, lo que necesita saber cómo se calcula gl_FragCoord.z de modo que pueda:
- Tome la transformación inversa desde gl_FragCoord.z a espacio visual
- Agregue la perturbación de profundidad
- Transforme esta profundidad perturbada nuevamente en el mismo espacio que el original gl_FragCoord.z.
Disculpe si esto parece una pregunta duplicada; hay una serie de otras publicaciones aquí que abordan cosas similares. Sin embargo, después de implementar todos ellos, ninguno funciona correctamente. En lugar de tratar de elegir uno para obtener ayuda, en este punto, estoy pidiendo un código completo que lo haga. Debería ser solo unas pocas líneas.
¿Has escrito un sombreador de vértices también? o solo un fragmento sombreador? –
No le daré un código de principio general, pero puedo darle [este enlace a la Wiki de OpenGL] (http://www.opengl.org/wiki/Compute_eye_space_from_window_space). Además de este enlace a un tutorial mío sobre [impostores y profundidad que muestra cómo hacer esto también] (http://www.arcsynthesis.org/gltut/Illumination/Tut13%20Deceit%20in%20Depth.html). Transformar la profundidad de vuelta es trivial. –
Michael: sí, pero es solo un pase a través del sombreador.Como sucede, los cálculos se realizan en el espacio mundial, por lo que puedo calcular el espacio visual en el programa de fragmentos. Nicol, ya había visto esa página. Lo implemento como: vec4 clip_pos = gl_ProjectionMatrix * vec4 (eye_pos, 1.0); float ndc_depth = clip_pos.z/clip_pos.w; gl_FragDepth = (((clip_far-clip_near) * ndc_depth) + clip_near + clip_far)/2.0; Desafortunadamente, la profundidad parece estar fuera del rango de profundidad, aunque no hay compensación. Gracias, – imallett