Ce n' (gl_FragCoord.z / gl_FragCoord.w) représentent?
Je veux le monde réel espace de la distance, et j'ai le sentiment de l'expérimentation que
(gl_FragCoord.z /gl_FragCoord.w)
est la profondeur dans l'espace? Mais je ne suis pas trop sûr.
MODIFIER je viens de trouvé où j'avais à l'origine de cet extrait de code. Apparemment, c'est la profondeur réelle de la caméra?
- Je ne suis pas sûr de ce que votre question est exactement. Demandez-vous ce que gl_FragCoord.z est la valeur est? Ou ce gl_FragDepth la valeur doit être? Ou tout simplement comment obtenir un espace-monde de profondeur? Cette dernière exige en expliquant exactement ce que vous voulez dire par l'espace-monde de profondeur, depuis la "profondeur" est généralement défini comme le planaire distance à la caméra.
- Comme indiqué dans la question, je veux que la distance réelle, dans l'espace des unités, à partir de l'appareil photo (ou il est près de l'avion, si cela est plus approprié).
Vous devez vous connecter pour publier un commentaire.
Cela a été demandé (par la même personne) et répondu d'ailleurs. Je suis de la paraphrase et de l'embellissement de la réponse ici:
Comme indiqué dans la section 15.2.2 de la OpenGL 4.3 profil de base des spécifications (PDF),
gl_FragCoord.w
est1 /clip.w
, oùclip.w
est le W du clip-espace de position (c'est à dire: ce que vous avez écrit àgl_Position
).gl_FragCoord.z
est générée par le processus suivant, en supposant que l'habitude se transforme:clip.z = (projectionMatrix * cameraPosition).z
ndc.z = clip.z /clip.w
glDepthRange
, près de/loin de valeurs.win.z = ((dfar-dnear)/2) * ndc.z + (dfar+dnear)/2
.Maintenant, en utilisant la valeur par défaut de la profondeur de la gamme de proximité=0, l'instant=1, on peut définir
win.z
en termes de clip-espace:(clip.z/clip.w)/2 + 0.5
. Si nous divisez-la pargl_FragCoord.w
, qui est l'équivalent de la multiplication parclip.w
, nous donnant ainsi:L'aide de la norme de la projection de la matrice,
clip.z
représente une échelle et le décalage de la caméra-espace Z composant. L'échelle et le décalage sont définis par la caméra de près/de loin les valeurs de la profondeur.clip.w
est, encore une fois dans le standard de la matrice de projection, seulement la négation de l'espace caméra Z. par conséquent, nous pouvons redéfinir notre équation en ces termes:Où
A
etB
représentent le décalage et l'échelle, près de/loin de, etC = (A - 1)/2
etD = B /2
.Par conséquent,
gl_FragCoord.z /gl_FragCoord.w
est pas l'espace caméra (ou de l'espace-monde) distance à la caméra. Il n'est ni l'espace caméra plane distance à la caméra. Mais il est une transformation linéaire de l'espace caméra de profondeur. Vous pouvez l'utiliser comme un moyen de comparer deux valeurs de la profondeur de ensemble, s'ils venaient à partir de la même matrice de projection et ainsi de suite.Pour calculer la caméra-Z de l'espace, vous avez besoin pour passer de la caméra près de/loin de votre matrice (OpenGL vous donne déjà la plage de près de/loin) et de calculer ces
A
etB
valeurs d'eux, ou vous avez besoin d'utiliser l'inverse de la matrice de projection. Alternativement, vous pouvez simplement utiliser la matrice de projection directement vous-même, puisque les fragment shaders pouvez utiliser les mêmes uniformes disponibles pour les vertex shaders. Vous pouvez choisir leA
etB
termes directement à partir de cette matrice.A = projectionMatrix[2][2]
, etB = projectionMatrix[3][2]
.Selon les docs:
Ainsi, il ressemble
gl_FragDepth
faut juste êtregl_FragCoord.z
sauf si vous avez quelque part d'autre dans votre shaders.gl_FragCoord.z
dans mon équation avecgl_FragDepth
(pour la production de linéaire de brouillard) pour vérifier votre réponse, et tout à coup, mon ensemble de la scène est noire, indépendamment de la distance. Alors que quand je pars à l'originegl_FragCoord.z
, je vois le brouillard après une certaine distance spécifiée.gl_FragCoord
représente, non pas un tutoriel. Et le spec est très clair:gl_FragCoord.z / gl_FragCoord.w
est errant non-sens.Comme
Et (probablement) de votre matrice de projection obtient w de z (si la dernière colonne est 0,0,-1,0); de