私のアルゴリズムはこれです:
複数の場所からのシャドウ マッピングを使用してシーンを 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)
//正しい出力