複数のレンダリングターゲットのコードで非常に奇妙な動作をしているのですが、これが機能するはずの方法を壊滅的に誤解しているのではないかと考え始めました。
バージョン2.1のコンテキストで実行しています。これが私が実行しているレンダリングセットアップコードのコアビットです:
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
GLenum buffers[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT };
glDrawBuffers(2,buffers);
次に、シェーダーはカラーデータをgl_FragColor[0]
とに書き込みますglFragColor[1]
。
これは、この質問で説明したのと本質的に同じ状況です。ただし、これをOS Xで実行すると、シェーダーは最初のレンダーターゲットにのみ出力します。OpenGLは、2つのカラーアタッチメントを使用したFBOの構築中、またはレンダリングプロセス中の任意の時点で、エラーをスローしません。
OSXの「OpenGLプロファイラー」の「トレース」ビューで何が起こっているかを調べると、このコード実行のドライバー側が次のように表示されます。
2.86 µs glBindFramebufferEXT(GL_FRAMEBUFFER, 1);
3.48 µs glDrawBuffersARB(2, {GL_COLOR_ATTACHMENT0, GL_ZERO});
これはおそらく、何も書き込まれていなかった理由を説明していGL_COLOR_ATTACHMENT1
ます。!GL_ZERO
への呼び出しで置き換えられているようです。glDrawBuffers
buffers[]
配列内のバッファーの順序をGL_COLOR_ATTACHMENT1_EXT
最初に切り替えてから、に切り替えるとGL_COLOR_ATTACHMENT0_EXT
、シェーダーはに書き込むだけGL_COLOR_ATTACHMENT1_EXT
で、GL_COLOR_ATTACHMENT0_EXT
に置き換えられているように見えますGL_ZERO
。
ここがおかしくなるところです。コードを使用する場合:
GLenum buffers[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT };
glDrawBuffers(3, buffers);
次に、統計ビューに次のように表示されます。
0.46 µs glDrawBuffersARB(3, {GL_COLOR_ATTACHMENT0, GL_ZERO, GL_COLOR_ATTACHMENT1});
gl_FragColor[0]
OpenGLはまだエラーをスローせず、シェーダーはとに書き込んでいても、両方のカラー添付ファイルにデータを正常に書き出しgl_FragColor[1]
ます。
したがって、私のプログラムは現在機能していますが、これは機能しないはずです。そして、OpenGLを最終的な失敗に追いやることが教育的であることを期待して、これをどこまで推し進めることができるかを知りたいと思いました。だから私はこのコードでコンパイルしてみました:
GLenum buffers[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT };
glDrawBuffers(4, buffers);
これを実行すると、OpenGLプロファイラーの「トレース」ビューに実行中として表示されます。
4.26 µs glDrawBuffersARB(4, {GL_COLOR_ATTACHMENT0, GL_ZERO, GL_COLOR_ATTACHMENT1, GL_ZERO});
そして今、OpenGLはあちこちに「無効なフレームバッファ操作」をスローしていますが、私のシェーダーはまだ両方のカラーアタッチメントポイントにカラーデータを正常に書き込んでいます。
これはすべて誰にとっても意味がありますか?私glDrawBuffers
は、呼ばれることになっている方法を壊滅的に誤解しましたか?
OpenGL Profilerの「リソース」ビューによると、私のフレームバッファー(番号1)は正常に見えます。予想通り、2つのカラーアタッチメントが取り付けられています。
Attached Objects:
{
{
GL_FRAMEBUFFER_ATTACHMENT: GL_COLOR_ATTACHMENT0
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT: GL_TEXTURE
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT: 1
GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT: 0
GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT: 0
GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT: 0
}
{
GL_FRAMEBUFFER_ATTACHMENT: GL_COLOR_ATTACHMENT1
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT: GL_TEXTURE
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT: 2
GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT: 0
GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT: 0
GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT: 0
}
{
GL_FRAMEBUFFER_ATTACHMENT: GL_COLOR_ATTACHMENT2
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT: GL_NONE
}
{
GL_FRAMEBUFFER_ATTACHMENT: GL_COLOR_ATTACHMENT3
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT: GL_NONE
}
{
GL_FRAMEBUFFER_ATTACHMENT: GL_COLOR_ATTACHMENT4
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT: GL_NONE
}
{
GL_FRAMEBUFFER_ATTACHMENT: GL_COLOR_ATTACHMENT5
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT: GL_NONE
}
{
GL_FRAMEBUFFER_ATTACHMENT: GL_COLOR_ATTACHMENT6
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT: GL_NONE
}
{
GL_FRAMEBUFFER_ATTACHMENT: GL_COLOR_ATTACHMENT7
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT: GL_NONE
}
{
GL_FRAMEBUFFER_ATTACHMENT: GL_DEPTH_ATTACHMENT
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT: GL_TEXTURE
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT: 3
GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT: 0
GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT: 0
GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT: 0
}
{
GL_FRAMEBUFFER_ATTACHMENT: GL_STENCIL_ATTACHMENT
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT: GL_NONE
}
}