12
votes

Qu'est-ce que (GL_FRAGOORGO.Z / GL_FRAGOORD.W) représente?

Je veux une distance d'espace mondiale réelle, et je reçois le sentiment d'expérimentation que

(gl_fragcoord.z ​​/ gl_fragoord.w)

est la profondeur dans l'espace mondial? Mais je ne suis pas trop sûr.

EDIT Je suis juste trouvé où j'avais à l'origine localisé Cet extrait de code . Apparemment, c'est la profondeur réelle de la caméra?


2 commentaires

Je ne suis pas sûr de votre question exactement. Demandez-vous quelle valeur GL_FRAGOORD.Z est-elle? Ou quelle valeur de GL_FRAGDEPTH devrait être? Ou simplement comment obtenir une profondeur d'espace mondial? Ce dernier nécessite d'expliquer ce que vous entendez exactement par la profondeur de l'espace mondial, car la "profondeur" est généralement définie comme la distance planaire de la caméra.


Comme indiqué dans la question, je souhaite la distance réelle, dans les unités spatiales mondiales, de la caméra (ou est proche de l'avion, si cela est plus approprié).


3 Réponses :


3
votes

Selon Les docs : xxx < / pré>

donc, il ressemble à GL_FRAGDEPTH devrait simplement être GL_FRAGCOORD.Z sauf si vous ne l'avez ailleurs ailleurs dans vos shaders.


8 commentaires

Nope, ce n'est pas le cas. C'est ce que j'ai pensé à l'origine. Je viens d'échanger le gl_fragcoord.z ​​ dans mon équation avec GL_FRAGDEPTH (pour la production de brouillard linéaire) pour vérifier votre réponse, et tout à coup, toute la scène est noire quelle que soit la distance. . Alors que lorsque je pars dans l'original gl_fragcoord.z ​​, je vois le brouillard après une distance spécifiée.


@Nickwiggill: Vous ne pouvez pas discuter avec la spécification OpenGL. Si votre code produit ce résultat, il est donc dû à un bogue dans votre code ou d'un bogue dans la mise en œuvre. C'est ce qui est écrit dans la spécification et c'est donc comment OpenGL se comporte.


@Nicolbolas. Intéressant, vous devriez dire ça; Regardez la modification que je viens de faire à la question. Je vais également énoncer à nouveau que, selon l'échelle de mes objets au monde, je suis prêt à accepter ce que l'article présente là-bas. Ce serait bien, cependant, de savoir si c'est le moyen le plus efficace d'obtenir une profondeur du monde. De ce que je vois ici , il est beaucoup plus efficace que le dérive de gl_fragdepth.


@Nickwiggill: juste parce que certains idiotes sur Internet indiquent que cela ne le rend pas vrai. La spécification OpenGL définit ce que GL_FRAGOORD représente, pas un didacticiel. Et la spécification est très claire: gl_fragcoord.z ​​/ gl_fragoord.w est un non-sens errant.


@Nicolbolas tempérer, tempérament! Je vois que vous ne comprenez pas les maths derrière elle, alors. Si vous l'avez fait, vous auriez réfuré ainsi. Tant pis!


@Nickwiggill: Je ne comprends pas les maths derrière elle ? I Ne comprend pas les maths derrière cela? Je n'ai pas besoin de faire face à des non-sens; La spécification dit ce qu'elle dit, et cette page est fausse.


@NickWiggill: Oui, les gens favorisant des non-informations comme réels et la descendance des faits réels me vent.


@Engineer Vous mélangez des variables d'entrée avec des valeurs de sortie. 'GL_FRAGOORD.Z' est disponible pour vous comme entrée. Ce n'est pas vrai pour 'GL_FRAGDEPTH'. C'est une valeur de sortie qui doit être remplie par vous. Si vous ne le remplissez pas, des spécifications disent que cela sera rempli automatiquement avec 'GL_FRAGOORD.Z'. Vous ne devez pas utiliser 'GL_FRAGDEPTH' comme entrée.



25
votes

Ceci a été posé (par la même personne) et répondit ailleurs . Je suis paraphrasant et embellir la réponse ici:

Comme indiqué à la section 15.2.2 de la OpenGL 4.3 Core Profil Spécification (PDF) , GL_FRAGOORD.W code> est 1 / clip.w code>, où clip .w code> est le composant W de la position de l'espace de clip (c.-à-d. Ce que vous avez écrit à GL_POSITION code>). p>

gl_fragoord.z ​​ code> est généré par le processus suivant, en supposant les transformations habituelles: p>

  1. espace-caméra à la transformation de l'espace Clip-Space, via la multiplication de matrice de projection dans le Shader Vertex. clip.z = (projectionmatrix * caméraposition) .z code> li>
  2. transformer en coordonnées de périphérique normalisées. ndc.z = clip.z / clip.w code> li>
  3. Transformez les coordonnées de la fenêtre, à l'aide de GLDEPTHANGE CODE> Proche / Valeurs lointaines . Win.Z = ((DFAR-DNEAR) / 2) * NDC.Z + (DFAR + DNEAR) / 2 CODE>. LI> ol>

    Maintenant, à l'aide de la plage de profondeur par défaut de près = 0, loin = 1, nous pouvons définir win.z code> en termes de clip-espace: (clip.z /clip.w)/2 + 0.5 code>. Si nous divisons ensuite cela par gl_fragoord.w code>, c'est-à-dire l'équivalent de la multiplication par clip.w code>, nous donnant ainsi: P>

    (gl_FragCoord.z / gl_FragCoord.w) = (A * cam.z + B -cam.z)/2 = (C * cam.z + D)
    


0 commentaires

0
votes

comme xxx pré>

et (probable) Votre matrice de projection obtient W à partir de -z (si la dernière colonne est 0,0, -1,0), alors; p>

float distanceToCamera = 1.0 / gl_FragCoord.w;


0 commentaires