OpenGL 3.2では、求めていることが可能です。拡散色をカラーテクスチャに、法線を別のカラーテクスチャに、深度を深度テクスチャに吐き出します。レンダーバッファは不要です。実際、レンダーバッファーはサンプルから取得できないため、単に問題になります。GPU glReadPixels(...)
メモリ内のすべてを維持するのではなく、RBOからデータをCPU上のテクスチャに使用するか、何らかの方法でコピーする必要があります。そう...
本当にしたい場合は、ファーストパスシェーダーでコードを記述して、深度などをFBOの別のカラーテクスチャアタッチメントに手動で出力できます。これは、ポストパスシェーダーで使用するためのものです。以下のためのOpenGLの 内部の深さのテストで使用する、あなたは、さらにあなたのFBOのGL_DEPTH_ATTACHMENTとしてRBOやテクスチャのセットのいずれかが必要になります。ただし、両方に役立つ単一のテクスチャを設定できます。これはより効率的で使いやすいです。
私の深度テクスチャ設定コードは次のようになります(Java、ByteBufferを無視します...整数ハンドル/ポインタを参照するために「id」を使用していることに注意してください。
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
、2番目、3番目のパスフラグメントシェーダーにユニフォームとして(または何が必要か)渡すことができます。ステンシルバッファでもまったく同じことができると安全に想定できると思います。