Dans OpenGL, comment puis-je découvrir la plage de profondeur d'un tampon de profondeur?

11

Je fais une application de rendu multi-passes GL pour iOS. La première passe se transforme en une texture de tampon de profondeur. La deuxième passe utilise les valeurs du tampon de profondeur pour contrôler l'application d'un fragment shader. Je souhaite redimensionner les valeurs du tampon de profondeur en quelque chose d'utile, mais avant de pouvoir le faire, je dois connaître la plage de valeurs de profondeur des valeurs du tampon de profondeur. Comment puis-je faire cela?

dugla
la source

Réponses:

10

La plage des valeurs écrites dans le tampon de profondeur correspond à ce que vous voulez qu'elles soient. En règle générale, ils se situent dans la plage de 0 à 1. La valeur réelle qui est écrite dans le tampon de profondeur est calculée pendant la transformation de la fenêtre, sur la base de la valeur Z du sommet dans l'espace NDC (après la division de la perspective par w dans l'espace du clip).

La valeur de profondeur NDC (Z, après la division de la perspective par W) est mise à l'échelle par la partie profondeur de la transformation de la fenêtre d'affichage (qui amène vos coordonnées X et Y dans un espace de coordonnées que vous associez aux pixels de la fenêtre), puis mise à l'échelle par (2^n-1)- qui est censé être lu comme "deux à la puissance de n" - nest la précision en bits du tampon de profondeur. La valeur résultante est écrite dans le tampon de profondeur.

OpenGL divise la définition de la matrice de transformation de fenêtre en appels glViewport et glDepthRange . glDepthRange est ce qui contrôle le facteur d'échelle responsable de la détermination de la plage de profondeur que vous demandez. Vous pouvez appeler glGetFloatv avec le GL_DEPTH_RANGEsélecteur pour récupérer la plage actuelle. Cela vous permettra d'utiliser la plage sans supposer qu'elle est de 0 à 1 (bien que 99,9% du temps, en pratique, personne ne la modifie jamais).

Pour en savoir plus, si vous voulez avoir un aperçu de la façon de reconstruire les mathématiques pour suivre la valeur Z tout le long de l'espace oculaire jusqu'au tampon de profondeur.


la source
Je vais donner celui-ci à Josh pour tout le matériel de référence supplémentaire et un conseil sur la planéité du triangle. Je suis enclin à faire un hack où se trouvent les plans de clip proches / lointains pour correspondre exactement à l'étendue z de la géométrie que je rend pour que la profondeur de carte ait de belles valeurs. Que fais-je? Je veux créer des effets de flou spécifiques à l'emplacement pendant le passage # 2 en fonction de ce qui se trouve dans la carte de profondeur du passage # 1.
dugla
7

Les valeurs dans le tampon de profondeur sont toujours comprises entre 0 et 1. Zéro est que le fragment rendu est à la profondeur du plan proche et 1 est que le fragment est à la profondeur du plan lointain. Et tout le reste.

Si vous voulez connaître la profondeur réelle dans l'espace mondial, il est facile de la calculer à partir du tampon de profondeur.

depth = nearPlane + ( farPlane - nearPlane ) * depthBufferValue;

Et c'est pourquoi vous spécifiez les plans proche et lointain dans votre matrice de projection, pour gagner en précision dans le tampon de profondeur.

Soyez également conscient de la différence entre la profondeur et la distance lorsque vous utilisez des valeurs de tampon de profondeur.

Notabene
la source
@notebene. Presque là. Je veux redimensionner la plage de valeurs dans le tampon de profondeur pour qu'elle soit exactement 0 -> 1. Donc, si les valeurs de profondeur min / max rendues sont de 0,25 / 0,75, je veux (valeur de profondeur - 0,25) / (0,75 - 0,25). Donc, existe-t-il un moyen de découvrir le min / max du tampon de profondeur après le passage 1 et de l'utiliser pour redimensionner pendant le passage 2.
dugla
1
@dugla: puisque vous rendez des triangles, qui sont plans, alors forcément les valeurs de profondeur minimum et maximum seront associées aux sommets minimum et maximum de la scène. Si vous connaissez ces deux, vous pouvez les transformer manuellement tout au long du pipeline et vous connaîtrez les valeurs minimales et maximales que vous écririez dans le tampon de profondeur. C'est peut-être plus facile que de rendre, puis de relire tout le tampon de profondeur et de l'itérer.