Saya punya renderbuffer (DepthStencil) dalam FBO dan saya perlu mendapatkan tekstur darinya. Saya tidak bisa memiliki tekstur DepthComponent dan renderbuffer DepthStencil di FBO, tampaknya, jadi saya perlu beberapa cara untuk mengubah renderbuffer menjadi tekstur DepthComponent setelah saya selesai menggunakannya untuk digunakan nanti di bawah pipa.
Saya sudah mencoba banyak teknik untuk mengambil komponen kedalaman dari renderbuffer selama berminggu-minggu tetapi saya selalu keluar dengan sampah. Yang saya inginkan pada akhirnya adalah tekstur yang sama dengan yang saya dapatkan dari FBO jika saya tidak menggunakan renderbuffer. Adakah yang bisa mengirim beberapa instruksi atau kode komprehensif yang mencakup operasi yang tampaknya sederhana ini?
EDIT:
Tautkan ke versi ekstrak kode http://dl.dropbox.com/u/9279501/fbo.cs
Skrining efek Kedalaman Bidang + FBO - tanpa kedalaman (!) Http://i.stack.imgur.com/Hj9Oe.jpg
Skrining tanpa efek Kedalaman Bidang + FBO - kedalaman berfungsi dengan baik http://i.stack.imgur.com/boOm1.jpg
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):
Dan kemudian:
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.sumber
Anda harus dapat membuat tekstur (bukan RenderBuffer) menggunakan format GL_DEPTH_STENCIL. Saya tidak yakin dengan proses yang tepat untuk menggunakan kedalaman dari tekstur seperti itu dalam program shader (yang saya anggap Anda gunakan, karena Anda menggunakan FBO), tetapi spesifikasi OpenGL harus menentukan saluran warna mana yang mendapatkan nilai mana ( Dugaan saya adalah bahwa R, G, dan B semuanya diatur ke kedalaman dan A diatur ke stensil).
Saya menargetkan OpenGL 3.2 hari ini, jadi Anda mungkin perlu memverifikasi bahwa format tekstur bisa diterapkan untuk Anda. Saya tidak pernah ingat versi mana yang memperkenalkan fitur yang berbeda.
sumber