2011-02-07 3 views
1

Ceci est une question simple, et j'en ai marre de chercher sur le web la bonne équation.GLSL convertir gl_FragCoord.z ​​dans l'espace des yeux z

Le principal problème est que tout le monde suggère de faire quelque chose comme ça VS:

varying float depth; 

depth = (gl_ModelViewMatrix * gl_Vertex); 

Mais je ne peux pas, parce que la profondeur est stockée dans une texture. Donc de toute façon, j'ai maintenant la valeur de profondeur, et la matrice de projection utilisée pour la créer à partir des coeurs de l'espace oculaire.

Si vous ne comprenez pas très bien, dites-le moi et j'essaierai de mieux le dire.

Merci d'avance. :)

Répondre

3

Si vous extrayez une valeur de profondeur de la texture - c'est dans la plage [0,1]. D'abord, vous aurez besoin à l'échelle dans [-1,1] plage et appliquer ensuite la projection inverse pour obtenir la profondeur modèle-vue:

vec2 xy = vec2(x_coord,y_coord); //in [0,1] range 
vec4 v_screen = vec4(xy, texture(samplerDepth,xy), 1.0); 
vec4 v_view = inverse(gl_ProjectionMatrix) * (2.0*(read_depth-vec3(0.5))); 
float view_depth = v_view.z/v_view.w; //transfer from homogeneous coordinates 
+0

v_screen devrait être read_depth, non? – karx11erx

+0

'read_depth = v_screen.z' – kvark