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 utiliserglReadPixels(...)
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):
gBufferDepthTexture = new Texture();
gBufferDepthTexture.id = glGenTextures();
gBufferDepthTexture.unit = 2;
gBufferDepthTexture.width = Display.getWidth();
gBufferDepthTexture.height = Display.getHeight();
gBufferDepthTexture.bytes = ByteBuffer.allocateDirect(Display.getWidth()*Display.getHeight() * 4);
glActiveTexture(gBufferDepthTexture.unit + GL_TEXTURE0); //eg. 0 + 33984 = GL_TEXTURE0, while 31 + 33984 = GL_TEXTURE31.
glBindTexture(GL_TEXTURE_2D, gBufferDepthTexture.id);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, gBufferDepthTexture.width, gBufferDepthTexture.height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, gBufferDepthTexture.bytes);
//...GL_UNSIGNED_INT or GL_UNSIGNED_BYTE may work better for you, instead... YMMV.
//glPixelStorei(GL_PACK_ALIGNMENT, 4);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
Et ensuite:
glBindFrameBuffer(GL_DRAW_FRAMEBUFFER, fbo.id);
//your existing glFramebufferTexture2D(...) calls here
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, gBufferDepthTexture.id, 0);
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.