2011-02-04 1 views
2

iPhoneのOpenGL ES 2.0 ..iPhone OpenGL ES 2.0でレンダリングとフレームバッファの表示を切り替えるにはどうすればいいですか?

  • まずフレームは、その後、私のフレームバッファにレンダリング(それはテンプレートのOpenGL ESのアプリケーションでは、デフォルトで動作するように)を提示します。
  • 次のフレームでは、そのレンダリングされたフレームバッファをシェーダの入力として使用し、別のフレームバッファにレンダリングし、その2番目のフレームバッファを表示します。
  • 次のフレームでは、最初のフレームバッファに再度レンダリングしながら、シェーダの入力としてframebuffer2を使用します。
  • リピート

どうすればよいですか?あなたは、次のようなコードを使用して、それを裏付け質感を持っているレンダ設定することができるはずです

答えて

9

:バッファを切り替え

// 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()を使用して、このオフスクリーンレンダバッファからピクセルを取り込むことができます。

私のサンプルアプリケーションherehereを試すことができます。前者は、カメラからのビデオフレームの処理を行い、オフスクリーンレンダバッファーでの処理中にビデオのパススルーを可能にする。後者の例では、ある時点でキューブマップテクスチャをレンダリングし、そのテクスチャを使用してティーポット上に環境マッピングを行います。

+0

これはすばらしい答えです。なぜあなたはそれを "ポジション"フレームバッファと呼んでいますか? – Nektarios

+0

@Nektarios - これは、私がリンクした最初のプロジェクト例からコードを取り除いたものです。カラートラッキングアルゴリズムでは、特定のしきい値内にあるすべてのピクセルを、赤いコンポーネントの相対的なX位置と緑のコンポーネントの相対的なY位置(他は1.0)に置き換えました。したがって、画像をパスした後、テストに合格するすべてのピクセルの平均色は、追跡されているオブジェクトの重心になります。詳細はこちらをご覧ください:http://www.sunsetlakesoftware.com/2010/10/22/gpu-accelerated-video-processing-mac-and-ios –

関連する問題