То, что вы спрашиваете, возможно в OpenGL 3.2. Мой FBO выплевывает диффузный цвет на текстуру цвета, нормали на текстуру другого цвета и текстуру глубины на глубину - никаких буферов рендеринга не требуется. На самом деле, рендер-буферы - это просто проблема, потому что вы не можете сэмплировать их, поэтому вам придется использоватьglReadPixels(...)
или каким-либо другим образом копировать данные из RBO и в текстуру на CPU, а не просто поддерживать все в памяти GPU. Так...
Если вы действительно этого хотите, вы можете написать код в своем шейдере первого прохода, чтобы вручную выводить такие вещи, как глубина, в отдельное вложение цветовой текстуры в вашем FBO. Это было бы для использования вами в ваших шейдерах post-pass. Для использования OpenGL в его внутреннем тестировании глубины вам дополнительно понадобится либо RBO, либо набор текстур в качестве GL_DEPTH_ATTACHMENT вашего FBO. Но вы можете настроить одну текстуру для обслуживания обоих - это более эффективно и проще в использовании.
Мой код установки текстуры глубины выглядит следующим образом (Java, просто игнорируйте материал ByteBuffer ... и обратите внимание, что я использую "id" для ссылки на целочисленные дескрипторы / указатели, так как эта концепция не очень хорошо работает в 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);
И позже:
glBindFrameBuffer(GL_DRAW_FRAMEBUFFER, fbo.id);
//your existing glFramebufferTexture2D(...) calls here
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, gBufferDepthTexture.id, 0);
Теперь вы можете передать gBufferDepthTexture
(или что у вас есть) как форму вторым, третьим проходным фрагментным шейдерам. Я думаю, что мы можем с уверенностью предположить, что вы можете сделать то же самое с буфером трафарета.