マルチパス レンダリング システムを使用して、OpenGL でキューブ マップを動的に生成しようとしています。私が使用している方法は、シーンをフレーム バッファ オブジェクトに正常にレンダリングします (glReadPixels でテスト済み)。フレーム バッファはテクスチャにアタッチされ、そのターゲットは GL_TEXTURE_CUBE_MAP_ARB です。glGetTexImage を使用してバインドされたテクスチャをクエリし、その内容をディスクに書き込むことによって、フレーム バッファの内容が最終的にテクスチャになることを確認しました。
しかし、オブジェクトにレンダリングするためにキューブ マップをバインドすると、テクスチャがメッシュ上に表示されません。
プロセスは次のとおりです。
1) GL_TEXTURE_CUBE_MAP_ARB からすべてのテクスチャをバインド解除します
2) フレーム バッファ オブジェクトをバインドします。
3) テクスチャをフレーム バッファのターゲット GL_COLOR_ATTACHMENT0_EXT にアタッチします。立方体の正の x 側 (GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB) から始めます。他のパスは後続のパスで続きます。
4) フレーム バッファの GL_DEPTH_ATTACHMENT_EXT をターゲットに深度レンダ バッファをアタッチします。
5) glDrawBuffer を使用して GL_COLOR_ATTACHMENT0_EXT に直接レンダリングします。
6) 適切な軸に沿ってシーンをレンダリングします。
7) フレーム バッファがまだバインドされている状態で、glFramebufferTexture2DEXT でテクスチャをデタッチします。
8) フレーム バッファのバインドを解除し、レンダリングを glDrawBuffer で GL_BACK にリダイレクトします。
9) キューブ マップのすべての面について、手順 1 ~ 8 を繰り返します。
10) 最終的なキューブ マップ テクスチャをバインドし、最終的なシーンをレンダリングします。テクスチャ座標の計算には GLSL シェーダが使用されます。
この手法は、ここで入手できるメモに基づいています。
これまでのデバッグ手順:
I) ディスクからスタティック キューブ マップをロードして、シェーダーをテストしました。期待どおりに動作します。
II) 最初の 6 パスの間に glReadPixels を使用してフレーム バッファの内容を照会しました。シーンはあるべき姿で現れました。
III) レンダリングが完了した後、glGetTexImage を使用してキューブ マップのコンテンツをコピーしました。コンテンツをイメージ ファイルとしてディスクに書き込みました。立方体のさまざまな面が正しく表示されました。
フレーム バッファ/テクスチャが正しくレンダリングされているとしか言えません。なんらかの理由で、結果のテクスチャを最終メッシュに表示することができません。テクスチャは最終的なレンダリング パスの前に確実にバインドされ、GL_TEXTURE_CUBE_MAP_ARB が有効になっています。
上記の手順で説明したように、読み取り/書き込みの競合を回避するために、テクスチャはフレーム バッファー レンダリングの前にアンバインドされます。同様に、同じ理由で、パスごとにテクスチャがフレーム バッファから切り離されます。
最初は、GL_COLOR_ATTACHMENT0_EXT の再利用が問題を引き起こすのではないかと心配していました。これは、私のデバッグ プロセスのステップ III を考えると、今ではありそうにないようです。さらに、インターネット フォーラムで、問題なく同じことをしている人々への言及を見つけました。
これは NVIDIA 9400M (Mac OS X) で行われています。OpenGL Extension Viewer は、この操作を実行するために必要なすべての拡張機能があることを報告しています。
これを引き起こしている可能性のあるものについての洞察をいただければ幸いです。