Lo que está preguntando es posible en OpenGL 3.2. Tengo mi FBO escupiendo color difuso a una textura de color, normal a otra textura de color y profundidad a una textura de profundidad, no se necesitan buffers de renderizado. De hecho, los renderbuffers son solo un problema, ya que no puede probarlos, por lo que debería usarglReadPixels(...)
o copiar de alguna manera los datos del RBO y en una textura en la CPU, en lugar de simplemente mantener todo en la memoria de la GPU. Entonces...
Si realmente lo desea, puede escribir código en su sombreador de primer paso para generar manualmente cosas como profundidad, en un archivo adjunto de textura de color separado en su FBO. Eso sería para que usted lo use en sus sombreadores de postpaso. Para el uso de OpenGL en su prueba de profundidad interna, también necesitará un conjunto de RBO o textura como GL_DEPTH_ATTACHMENT de su FBO. Pero puede configurar una textura única para servir a ambos : esto es más eficiente y más fácil de usar.
Mi código de configuración de textura de profundidad se ve así (Java, simplemente ignore las cosas de ByteBuffer ... y tenga en cuenta que uso "id" para referirme a los controladores / punteros enteros, ya que ese concepto realmente no se siente 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);
Y después:
glBindFrameBuffer(GL_DRAW_FRAMEBUFFER, fbo.id);
//your existing glFramebufferTexture2D(...) calls here
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, gBufferDepthTexture.id, 0);
Ahora puede pasar gBufferDepthTexture
(o lo que tenga) como uniforme a sus sombreadores de fragmentos de segundo, tercer paso. Creo que podemos suponer con seguridad que puede hacer exactamente lo mismo con el búfer de plantilla.