2

iPhone OpenGL ES 2.0..

  • 最初のフレーム、フレーム バッファにレンダリングしてから表示します (テンプレート OpenGL ES アプリケーションではデフォルトで機能するため)。
  • 次のフレームでは、そのレンダリングされたフレーム バッファをシェーダーへの入力として使用し、別のフレーム バッファにレンダリングしてその 2 番目のフレーム バッファを提示したいと考えています。
  • 次のフレームでは、framebuffer2 をシェーダーへの入力として使用し、最初のフレームバッファーに再度レンダリングします。
  • 繰り返す

どうすればいいですか?

4

1 に答える 1

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

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

于 2011-02-04T19:12:59.427 に答える