私のアルゴリズムはこれです:
複数の場所からのシャドウ マッピングを使用してシーンを FBO にレンダリングする シャドウ マッピングを使用してシーンを画面にレンダリングする ...まだ実装しなければならない黒魔術... ステップ 1 のサンプルをステップ 2 の画像と組み合わせる
ステップ 1 と 2 をデバッグしようとしていますが、奇妙な動作に遭遇しています。各シャドウ マップ パスの私のアルゴリズムは次のとおりです。 各ライトの POV から深度配列テクスチャに接続された FBO にシーンをレンダリングします 視点からシーンをレンダリングし、頂点/フラグメント シェーダーを使用して深度を比較します
この方法でアルゴリズムを実行すると:
ポイントからFBOへのレンダリング ポイントからスクリーンへのレンダリング glutSwapBuffers()
スクリーン パスの法線ベクトルが正しくないように見えます (反転している可能性があります)。拡散照明の計算が正しくないため、それが問題であると確信していますが、マテリアルの色は正しく、影は正しい場所に表示されます。したがって、原因は法線だけにあるようです。
しかし、もしそうなら
render from point to FBO render from point to Screen glutSwapBuffers() //ここでは間違っている render from point to Screen glutSwapBuffers()
2 番目のパスは正しいです。フレームバッファ呼び出しに問題があると思います。以下のログから問題の内容を確認できますか? これは、「buffer」を grep したラッパ トレースからのもので、もう少し明確にするためにいくつかの編集が加えられています。
[情報] trace.call: glGenFramebuffersEXT(1, 0xdfeb90 -> { 1 }) [情報] trace.call: glGenFramebuffersEXT(1, 0xdfebac -> { 2 }) [情報] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1) [情報] trace.call: glDrawBuffer(GL_NONE) [情報] trace.call: glReadBuffer(GL_NONE) [情報] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 0) //FBO へのレンダリングを開始 [情報] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 2) [情報] trace.call: glReadBuffer(GL_NONE) [情報] trace.call: glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 2, 0) [情報] trace.call: glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 3, 0) [情報] trace.call: glDrawBuffer(GL_COLOR_ATTACHMENT0) //シャドウのデプス tex 配列にアタッチされた FBO にバインドします [情報] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1) [情報] trace.call: glFramebufferTextureLayerARB(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 1, 0, 0) [INFO] trace.call: glClear(GL_DEPTH_BUFFER_BIT) // ジオメトリを描画 // FBO にバインドします。シャドウ マップされたイメージをレンダリングしたい [情報] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 2) [情報] trace.call: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) // ジオメトリを描画 //スクリーンパスに描画 //再びシャドウ マッピング FBO [情報] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1) [情報] trace.call: glFramebufferTextureLayerARB(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 1, 0, 0) [INFO] trace.call: glClear(GL_DEPTH_BUFFER_BIT) // ジオメトリを描画 //画面にバインド [情報] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 0) [情報] trace.call: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) //終了、バッファをスワップ [情報] trace.call: glXSwapBuffers(0xd5fc10, 0x05800002) //間違った出力 // 画面へのレンダリングの 2 回目の試行: [情報] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1) [情報] trace.call: glFramebufferTextureLayerARB(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 1, 0, 0) [INFO] trace.call: glClear(GL_DEPTH_BUFFER_BIT) // ジオメトリを描画 [情報] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 0) [情報] trace.call: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ジオメトリを描く [情報] trace.call: glXSwapBuffers(0xd5fc10, 0x05800002) //正しい出力