Je lis actuellement d'une texture de profondeur dans une profondeur de post-traitement des shaders de champ utilisant le code GLSL suivant:Conversion d'un échantillon de texture de la profondeur à une distance
vec4 depthSample = texture2D(sDepthTexture, tcScreen);
float depth = depthSample.x * 255.0/256.0 +
depthSample.y * 255.0/65536.0 +
depthSample.z * 255.0/16777216.0;
Et puis en convertissant la valeur de la profondeur à un espace de vue distance basée sur les distances d'avion proches et lointains:
float zDistance = (zNear * zFar)/(zFar - depth * (zFar - zNear));
tout cela semble fonctionner assez bien, mais je suis intéressé de savoir comment faire le calcul ci-dessus basée uniquement sur la matrice de projection actuelle sans avoir besoin zNear
etséparésvaleurs.
Ma première tentative implique la multiplication (vec4(tcscreen.x, tcScreen.y, depth, 1.0) * 2.0 - 1.0)
par l'inverse de la matrice de projection, en divisant le résultat par par w
, en prenant la valeur z
résultante comme la distance, mais cela ne semble pas fonctionner. Quelle est la bonne approche ici?
En outre, lors de l'utilisation de l'écrêtage tronconique oblique pour déplacer le plan proche sur un plan de découpage choisi, la distance de plan proche est-elle potentiellement potentiellement différente pour chaque pixel? Et si c'est le cas, cela signifie-t-il que tous les shaders qui calculent une distance à partir d'une texture en profondeur doivent être conscients de ce cas et ne pas supposer une distance proche du plan constant?
Merci!
J'avais en fait le problème inverse, donc votre énoncé de problème a fini par être ma solution. Merci, – imallett