2011-08-26 7 views
22

私はこのテーマに関して多くの資料を見てきましたが、私が見つけた例といくつかの違いがあり、正しいプロセスをしっかりと理解することができていません。うまくいけば、誰かが私が正しい道にいるかどうか教えてくれるでしょう。私はまた、OS X Snow LeopardとXcode 3の最新バージョンでこれをやっていることを言及する必要があります。OpenGL複数のレンダリングターゲットを設定する

例として、通常のものと色のものの2つのターゲットに書きたいとしましょう。これを行うには私は1つのフレームバッファを作成し、2つのそれにテクスチャだけでなく、深さのテクスチャバインド:レンダリングの前に

glGenFramebuffersEXT(1, &mFBO); 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO); 

glGenTextures(1, &mTexColor); 
glBindTexture(GL_TEXTURE_2D, mTexColor); 
//<texture params> 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, mTexColor, 0); 

glGenTextures(1, &mTexNormal); 
glBindTexture(GL_TEXTURE_2D, mTexNormal); 
//<Texture params> 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, mTexNormal, 0); 

glGenTextures(1, &mTexDepth); 
glBindTexture(GL_TEXTURE_2D, mTexDepth); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, w, h, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL); 
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, mTexDepth, 0); 

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0) 

を、私は再びフレームバッファをバインドし、次に実行します。

GLenum buffers[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT }; 
glDrawBuffers(2, buffers); 

これでしょうさらに描画呼び出しがフレームバッファに描画されることを意味します。 (私は思う?)

私はシェーダを設定してシーンを描画します。私の頂点シェーダでは、通常通りに法線/位置/色を処理し、データをフラグメントシェーダに渡します。フラグメントは次のようになります:

gl_FragData[0] = OutputColor; 
gl_FragData[1] = OutputNormal; 

この時点では、2つのテクスチャが必要です。 1つはレンダリングされたすべてのオブジェクトの色と1つは法線を持つものです。これはすべて正しいのでしょうか?私は今、これらのテクスチャを他のものと同じように使用することができます。つまり、フルスクリーンクワッドにレンダリングするといいでしょうか?

答えて

10

妥当と思われます。これは確かにそれを行う一般的な方法です。さらなる処理のために奥行きデータをテクスチャとして必要としない場合は、添付ファイルにレンダバッファを使用することもできますが、テクスチャもうまく動作するはずです。

すべての設定が完了したら、glCheckFramebufferStatusEXTを使用して、フレームバッファが現在の設定で有効ですが、コードが正常に表示されているかどうかを確認することもできます。問題がなく、これが保証のためだけのものだった場合は、あなたが正しい軌道に乗っていることを確認してください。そうでなければ何が間違っているか教えてください。

+0

答えをありがとう!私が必要としなかったものを配分していないことを確認するための保証型の質問のほうが多く、注文は大丈夫だった。テクスチャの代わりにレンダバッファを使用すると、パフォーマンス上のメリットはありますか? – TaylorP

+0

@TaylorP私は知らない、おそらくない。 –

+2

私はそれが古い質問であることを知っています。しかし、はい、レンダリングバッファを使用すると、テクスチャを使用する場合に比べてパフォーマンスが向上します。レンダバッファは、描画操作を処理するためのデータとプロセスを格納する最適化された方法を利用することができます。 – Vallentin

関連する問題