J'ai un tampon de rendu (DepthStencil) dans un FBO et j'ai besoin d'en obtenir une texture. Je ne peux pas avoir à la fois une texture DepthComponent et un renduerbuffer DepthStencil dans le FBO, il me semble donc j'ai besoin d'un moyen de convertir le renduerbuffer en une texture DepthComponent une fois que j'en aurai fini pour l'utiliser plus tard dans le pipeline.
J'ai essayé de nombreuses techniques pour saisir le composant de profondeur du renduerbuffer pendant des semaines, mais je sors toujours avec des ordures. Tout ce que je veux à la fin, c'est la même texture que j'obtiendrais d'un FBO si je n'utilisais pas de rendu de tampon. Quelqu'un peut-il publier des instructions complètes ou du code couvrant cette opération apparemment simple?
ÉDITER:
Linky vers une version extraite du code http://dl.dropbox.com/u/9279501/fbo.cs
Screeny de l'effet Depth of Field + FBO - sans profondeur (!) Http://i.stack.imgur.com/Hj9Oe.jpg
Screeny sans effet de profondeur de champ + FBO - profondeur de travail fine http://i.stack.imgur.com/boOm1.jpg
Ce que vous demandez est possible dans OpenGL 3.2. J'ai mon FBO qui crache une couleur diffuse en une texture de couleur, des normales en une autre texture de couleur et une profondeur en une texture de profondeur - aucun tampon de rendu n'est nécessaire. En fait, les rendus de tampons ne sont qu'un problème, car vous ne pouvez pas en échantillonner, vous devez donc utiliser
glReadPixels(...)
ou autrement copier les données hors du RBO et dans une texture sur le CPU, au lieu de simplement tout conserver dans la mémoire du GPU. Donc...Si vous le souhaitez vraiment, vous pouvez écrire du code dans votre shader de premier passage pour sortir manuellement des éléments tels que la profondeur, dans une pièce jointe de texture de couleur distincte dans votre FBO. Ce serait pour vous dans vos shaders post-pass. Pour l' utilisation d'OpenGL dans ses tests de profondeur internes, vous auriez également besoin d'un RBO ou d'un ensemble de textures comme GL_DEPTH_ATTACHMENT de votre FBO. Mais vous pouvez configurer une seule texture pour servir les deux - c'est plus efficace et plus facile à utiliser.
Mon code de configuration de texture de profondeur ressemble à ceci (Java, ignorez simplement le truc ByteBuffer ... et notez que j'utilise "id" pour faire référence aux poignées / pointeurs entiers, car ce concept ne fonctionne pas vraiment bien en Java):
Et ensuite:
Vous pouvez maintenant passer
gBufferDepthTexture
(ou ce que vous avez) comme uniforme à vos shaders de fragments de deuxième et troisième passes. Je pense que nous pouvons supposer en toute sécurité que vous pouvez faire exactement la même chose avec le tampon de gabarit.la source
Vous devriez pouvoir créer une texture (au lieu d'un RenderBuffer) en utilisant le format GL_DEPTH_STENCIL. Je ne suis pas sûr du processus exact d'utilisation de la profondeur d'une telle texture dans un programme de shader (que je suppose que vous utilisez, car vous utilisez des FBO), mais la spécification OpenGL devrait spécifier quels canaux de couleur obtiennent quelles valeurs ( ma conjecture serait que R, G et B sont tous mis à la profondeur et A est réglé au pochoir).
Je cible OpenGL 3.2 ces jours-ci, vous devrez donc peut-être vérifier que le format de texture est réalisable pour vous. Je ne me souviens jamais quelles versions présentent différentes fonctionnalités.
la source