สิ่งที่คุณถามเป็นไปได้ใน OpenGL 3.2 ฉันได้ FBO ของฉันออกมากระจายสีให้กับพื้นผิวสีเป็นบรรทัดฐานของพื้นผิวสีอื่นและความลึกของพื้นผิวที่ลึก - ไม่จำเป็นต้องใช้ renderbuffers ในความเป็นจริง renderbuffers เป็นเพียงปัญหาเพราะคุณไม่สามารถสุ่มตัวอย่างจากพวกเขาดังนั้นคุณต้องใช้glReadPixels(...)
มิฉะนั้นคัดลอกข้อมูลออกจาก RBO และอย่างใดอย่างหนึ่งลงในพื้นผิวบน CPU แทนที่จะรักษาทุกอย่างในหน่วยความจำ GPU ดังนั้น...
หากคุณต้องการจริงๆคุณสามารถเขียนโค้ดใน shader รอบแรกเพื่อส่งออกสิ่งต่าง ๆ เช่นความลึกไปยังสิ่งที่แนบพื้นผิวสีแยกต่างหากใน FBO ของคุณ นั่นจะเป็นการใช้โดยคุณในการโพสต์ผ่านของคุณ สำหรับการ ใช้งาน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
(หรือสิ่งที่มีคุณ) เป็นเครื่องแบบไปที่ชิ้นที่สองและสามของคุณ ฉันคิดว่าเราสามารถสรุปได้อย่างปลอดภัยว่าคุณสามารถทำสิ่งเดียวกันกับบัฟเฟอร์ stencil