Was Sie fragen, ist in OpenGL 3.2 möglich. Mein FBO spuckt diffuse Farbe auf eine Farbtextur aus, Normalen auf eine andere Farbtextur und Tiefe auf eine Tiefentextur - es werden keine Renderbuffer benötigt. Tatsächlich stellen Renderbuffer nur ein Problem dar, da Sie keine Samples daraus erstellen können. Sie müssten also glReadPixels(...)
die Daten aus dem RBO in eine Textur auf der CPU kopieren oder anderweitig verwenden, anstatt nur alles im GPU-Speicher zu behalten. So...
Wenn Sie wirklich wollen, können Sie Code in Ihren First-Pass-Shader schreiben, um Inhalte wie die Tiefe manuell in einem separaten Farbtextur-Anhang in Ihrem FBO auszugeben. Das wäre für Sie in Ihren Post-Pass-Shadern von Nutzen . Für die Verwendung von OpenGL beim internen Tiefentest benötigen Sie zusätzlich entweder einen RBO oder ein Textur-Set als GL_DEPTH_ATTACHMENT Ihres FBO. Sie können jedoch eine einzige Textur einrichten, um beide zu bedienen - dies ist effizienter und einfacher zu handhaben.
Mein Setup-Code für die Tiefenstruktur sieht folgendermaßen aus (Java, ignoriere einfach das ByteBuffer-Zeug ... und beachte, dass ich "id" verwende, um auf ganzzahlige Handles / Zeiger zu verweisen, da dieses Konzept in Java nicht wirklich gut funktioniert):
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);
Und später:
glBindFrameBuffer(GL_DRAW_FRAMEBUFFER, fbo.id);
//your existing glFramebufferTexture2D(...) calls here
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, gBufferDepthTexture.id, 0);
Sie können jetzt gBufferDepthTexture
(oder was haben Sie) als Uniform an Ihre Fragment-Shader des zweiten und dritten Durchgangs übergeben. Ich denke, wir können davon ausgehen, dass Sie mit dem Schablonenpuffer genau dasselbe tun können.