OpenGL - Comment accéder aux valeurs du buffer de profondeur? - Ou: gl_FragCoord.z vs. Rendu de la profondeur à la texture
Je veux accéder à la profondeur de la mémoire tampon à la valeur en cours de traitement pixel d'un pixel shader.
Comment pouvons-nous atteindre cet objectif? Fondamentalement, il semble y avoir deux options:
- Rendre la profondeur de la texture. Comment peut-on le faire et quel est la différence?
- Utiliser la valeur fournie par gl_FragCoord.z - Mais: Est-ce la bonne valeur?
source d'informationauteur 0xbadf00d
Vous devez vous connecter pour publier un commentaire.
Sur la question 1: Vous ne pouvez pas les lire directement à partir du tampon de profondeur dans le fragment shader (sauf si il y a des récentes extensions, je ne suis pas familier avec). Vous devez vous rendre à un Frame Buffer Object (FBO). Les étapes habituelles:
glGenFramebuffers
etglBindFramebuffer
si vous n'avez pas utilisé les organisations confessionnelles avant.GL_COLOR_ATTACHMENT0
point de fixation de votre FBO avecglFramebufferTexture2D
ouglFramebufferRenderbuffer
. Si vous ne se soucient que de la profondeur de cette passe de rendu, vous pouvez sauter cette et rendu sans un tampon de couleur.GL_DEPTH_ATTACHMENT
point de fixation de la FBO.glBindFramebuffer
pour revenir à la valeur par défaut du framebuffer.Sur la question 2:
gl_FragCoord.z
est la valeur de profondeur de la fragment que votre shader de fonctionnement, pas la valeur actuelle du tampon de profondeur à la fragment de position.gl_FragCoord.z
est la fenêtre de l'espace-valeur de profondeur de l'actuel fragment. Il n'a rien à voir avec la valeur stockée dans le tampon de profondeur. La valeur peut plus tard être écrit dans le tampon de profondeur, si le fragment est pasdiscard
ed et il passe un pochoir/test de profondeur.Techniquement il y a un peu de matériel optimisations qui vont écrire/test de la profondeur au début, mais à toutes fins et intentions
gl_FragCoord.z
n'est pas la valeur stockée dans le tampon de profondeur.À moins de vous rendre dans plusieurs passages, vous ne pouvez pas lire et écrire dans le tampon de profondeur dans un fragment shader. C'est-à-dire, vous ne pouvez pas utiliser une profondeur de texture de lire la profondeur et de tourner autour et écrire une nouvelle profondeur. Cela revient à essayer de mettre en œuvre le mélange dans le fragment shader, sauf si vous faites quelque chose d'exotique avec DX11 du matériel de classe et de l'image load/store, il n'est tout simplement pas aller travailler.
Si vous avez uniquement besoin de la profondeur de la finale tirée de la scène pour quelque chose comme l'ombre de la cartographie, alors vous pouvez faire une profondeur de seulement pré-pass pour remplir le tampon de profondeur. Lors de la seconde passe, vous de lire le tampon de profondeur, mais pas en écriture.