:バッファを切り替え
// 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()
を使用して、このオフスクリーンレンダバッファからピクセルを取り込むことができます。
私のサンプルアプリケーションhereとhereを試すことができます。前者は、カメラからのビデオフレームの処理を行い、オフスクリーンレンダバッファーでの処理中にビデオのパススルーを可能にする。後者の例では、ある時点でキューブマップテクスチャをレンダリングし、そのテクスチャを使用してティーポット上に環境マッピングを行います。
これはすばらしい答えです。なぜあなたはそれを "ポジション"フレームバッファと呼んでいますか? – Nektarios
@Nektarios - これは、私がリンクした最初のプロジェクト例からコードを取り除いたものです。カラートラッキングアルゴリズムでは、特定のしきい値内にあるすべてのピクセルを、赤いコンポーネントの相対的なX位置と緑のコンポーネントの相対的なY位置(他は1.0)に置き換えました。したがって、画像をパスした後、テストに合格するすべてのピクセルの平均色は、追跡されているオブジェクトの重心になります。詳細はこちらをご覧ください:http://www.sunsetlakesoftware.com/2010/10/22/gpu-accelerated-video-processing-mac-and-ios –