2013-04-26 7 views
4

J'essaie de mettre en œuvre un ombrage/éclairage différé. Afin de réduire le nombre/taille des tampons que j'utilise, j'ai voulu utiliser la texture de profondeur pour reconstruire la position du monde plus tard. Pour ce faire, je multiplie les coordonnées du pixel par l'inverse de la matrice de projection et l'inverse de la matrice de la caméra. Ce genre de travaux, mais la position est un peu large. Voici la différence absolue avec une texture de position mondiale échantillonné:la position du monde reconstruite à partir de la profondeur est fausse

enter image description here

Pour référence, c'est le code que j'utilise dans le deuxième fragment shader passe:

vec2 screenPosition_texture = vec2((gl_FragCoord.x)/WIDTH, (gl_FragCoord.y)/HEIGHT); 
float pixelDepth = texture2D(depth, screenPosition_texture).x; 

vec4 worldPosition = pMatInverse*vec4(VertexIn.position, pixelDepth, 1.0); 
worldPosition = vec4(worldPosition.xyz/worldPosition.w, 1.0); 
//worldPosition /= 1.85; 
worldPosition = cMatInverse*worldPosition_byDepth; 

Si je décommenter worldPosition/= 1,85 , la position est reconstruite beaucoup mieux (sur ma géométrie/gamme de valeurs de profondeur). J'ai juste obtenu cette valeur en déconnant après avoir comparé ma sortie avec ce qu'elle devrait être (stockée dans une troisième texture). J'utilise 0,1 près, 100,0 loin et mes géométries sont jusqu'à environ 15. Je sais qu'il peut y avoir des erreurs de précision, mais cela semble un peu trop d'une erreur trop proche de la caméra. Ai-je manqué quelque chose ici?

+0

double possible de [Calculer clipspace.w de clipspace.xyz et (inv) matrice de projection] (http://stackoverflow.com/questions/14523588/calculate-clipspace- w-from-clipspace-xyz-et-inv-projection-matrix) –

+1

Merci! Il s'avère que je n'ai pas transformé ma profondeur après l'avoir récupérée du tampon. Je n'ai jamais entendu parler de la conversion de profondeur de ndcspace. pixelDepth = pixelDepth * 2.0-1.0; a fait l'affaire :) Modifier: maintenant comment puis-je le marquer comme répondu? –

+0

Vous devez répondre à votre propre question! –

Répondre

1

Comme mentionné dans un commentaire: Je n'ai pas converti la valeur de profondeur de l'espace ndc en espace de découpage. Je aurais dû ajouter cette ligne:

pixelDepth=pixelDepth*2.0-1.0; 
Questions connexes