web-dev-qa-db-ja.com

OpenGLマルチレンダーターゲットの設定

このテーマについてはたくさんの資料を見てきましたが、見つけた例にはいくつかの違いがあり、正しいプロセスをしっかりと理解するのに苦労しています。うまくいけば、誰かが私が正しい軌道に乗っているかどうか教えてくれます。また、OS X SnowLeopardと最新バージョンのXcode3でこれを行っていることにも言及する必要があります。

例として、通常用とカラー用の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つは法線です。これはすべて正しいですか?これで、これらのテクスチャを他のテクスチャと同じように使用できるようになります。たとえば、フルスクリーンのクワッドにレンダリングします。

23
TaylorP

音と見た目は合理的です。これは確かにそれを行うための一般的な方法です。さらに処理するためにテクスチャとして深度データが必要ない場合は、添付ファイルにレンダーバッファを使用することもできますが、テクスチャも正常に機能するはずです。

すべてのセットアップが完了した後でglCheckFramebufferStatusEXTを使用して、フレームバッファーが現在の構成で有効かどうかを確認することもできますが、コードは正常に見えます。問題がなく、これが単なる保証であった場合は、正しい方向に進んでいるので安心してください。そうでない場合は、何が問題なのかをお知らせください。