Apa yang Anda minta dimungkinkan di OpenGL 3.2. Saya punya FBO saya memuntahkan warna menyebar ke tekstur warna, normals ke tekstur warna lain, dan kedalaman ke tekstur kedalaman - tidak diperlukan renderbuffers. Faktanya, renderbuffer hanyalah masalah, karena Anda tidak dapat mengambil sampel darinya, jadi Anda harus menggunakan glReadPixels(...)
atau dengan cara lain menyalin data dari RBO dan menjadi tekstur pada CPU, alih-alih hanya mempertahankan semua yang ada dalam memori GPU. Begitu...
Jika Anda benar-benar ingin, Anda dapat menulis kode dalam shader first-pass Anda untuk secara manual menampilkan hal-hal seperti kedalaman, ke lampiran tekstur warna yang terpisah di FBO Anda. Itu akan untuk digunakan oleh Anda dalam shader pasca-pass Anda. Untuk penggunaan OpenGL dalam pengujian kedalaman internal, Anda juga membutuhkan RBO atau tekstur yang ditetapkan sebagai GL_DEPTH_ATTACHMENT FBO Anda. Tetapi Anda dapat mengatur satu tekstur untuk melayani keduanya - ini lebih efisien & lebih mudah digunakan.
Kode pengaturan tekstur kedalaman saya terlihat seperti ini (Java, abaikan saja hal-hal ByteBuffer ... dan perhatikan saya menggunakan "id" untuk merujuk ke bilangan bulat pegangan / pointer, karena konsep itu tidak benar-benar cocok dengan 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);
Dan kemudian:
glBindFrameBuffer(GL_DRAW_FRAMEBUFFER, fbo.id);
//your existing glFramebufferTexture2D(...) calls here
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, gBufferDepthTexture.id, 0);
Anda sekarang dapat lulus gBufferDepthTexture
(atau apa yang Anda miliki) sebagai seragam untuk shaders fragmen pass kedua, ketiga Anda. Saya pikir kita dapat dengan aman berasumsi bahwa Anda dapat melakukan hal yang persis sama dengan buffer stensil.