0

私のアルゴリズムはこれです:

複数の場所からのシャドウ マッピングを使用してシーンを 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)
//正しい出力
4

1 に答える 1

0

FBO コードに問題はありません。しかし、あなたは私たちにすべてを話しているわけではありません。これが本当にあなたがしていたことである場合:

[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 0)
[INFO] trace.call: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
//finished, swap buffers
[INFO] trace.call: glXSwapBuffers(0xd5fc10, 0x05800002)
//INCORRECT OUTPUT

次に、誤った出力が黒い画面になります (デフォルトのフレームバッファーをバインドし、バッファーをクリアしてスワップするため)。glClear() と glXSwapBuffers() の間で何らかのレンダリングが行われている必要があります。この grep-ped トレースの代わりに、完全なソース コードを投稿する必要があります。

第二に、あなたの問題は FBO とは何の関係もありません。ほとんどの場合、マトリックスを正しく設定していない可能性があります (ライトからのルックアットとカメラからのルックアットを混在させると、簡単に混乱します)。あなたの答えは少し乱雑であるため、コードも少し乱雑である可能性があります。そこを探ってみるといいかもしれません...

于 2012-02-13T10:53:59.877 に答える