次のようなコードを使用して、テクスチャ バッキングを持つレンダ バッファを設定できるはずです。
// Offscreen position framebuffer object
glGenFramebuffers(1, &positionFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, positionFramebuffer);
glGenRenderbuffers(1, &positionRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, positionRenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8_OES, FBO_WIDTH, FBO_HEIGHT);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, positionRenderbuffer);
// Offscreen position framebuffer texture target
glGenTextures(1, &positionRenderTexture);
glBindTexture(GL_TEXTURE_2D, positionRenderTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, FBO_WIDTH, FBO_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, positionRenderTexture, 0);
バッファの切り替えは、次のようなコードを使用するのと同じくらい簡単です。
glBindFramebuffer(GL_FRAMEBUFFER, positionFramebuffer);
glViewport(0, 0, FBO_WIDTH, FBO_HEIGHT);
次に、そのバッファにレンダリングし、結果のテクスチャを単純なシェーダに渡すことで表示できます。このシェーダは、ジオメトリの長方形の部分内に表示します。そのテクスチャは、テクスチャによって支えられている別の同様のレンダバッファにレンダリングするシェーダに供給することもできます。
CPU ベースの処理または読み出しを行う必要がある場合はglReadPixels()
、このオフスクリーン レンダバッファからピクセルを取り込むために使用できます。
この例については、こことここで私のサンプル アプリケーションを試すことができます。前者は、カメラからのビデオ フレームの処理を行います。設定の 1 つは、オフスクリーン レンダ バッファで処理を行いながらビデオのパススルーを許可します。後者の例では、ある時点でキューブ マップ テクスチャにレンダリングし、そのテクスチャを使用してティーポットの環境マッピングを行います。