私はこのテーマに関して多くの資料を見てきましたが、私が見つけた例といくつかの違いがあり、正しいプロセスをしっかりと理解することができていません。うまくいけば、誰かが私が正しい道にいるかどうか教えてくれるでしょう。私はまた、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つは法線を持つものです。これはすべて正しいのでしょうか?私は今、これらのテクスチャを他のものと同じように使用することができます。つまり、フルスクリーンクワッドにレンダリングするといいでしょうか?
答えをありがとう!私が必要としなかったものを配分していないことを確認するための保証型の質問のほうが多く、注文は大丈夫だった。テクスチャの代わりにレンダバッファを使用すると、パフォーマンス上のメリットはありますか? – TaylorP
@TaylorP私は知らない、おそらくない。 –
私はそれが古い質問であることを知っています。しかし、はい、レンダリングバッファを使用すると、テクスチャを使用する場合に比べてパフォーマンスが向上します。レンダバッファは、描画操作を処理するためのデータとプロセスを格納する最適化された方法を利用することができます。 – Vallentin