シャドウマッピングについて混乱しています。これが私が理解したことです(以下の手順は機能していません:))
利益を得る方法(コードについて混乱しないでください。Javaで書いているからです):
1.パラメータを使用して空のdepthTexture(私のものは1024x1024)を作成します
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE)
と
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, GL_NULL)
2. FBOを作成し、そのテクスチャをそれに添付します
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthTexture, 0)
3.照明カメラの新しい投影とビューマトリックスを設定します
シーンが良く見えるので、メインカメラと同じものを別の座標で使用しました(試してみたので、問題はありません...と思います)。
4.新しい小さなシェーダーを作成してFBOのgl_Positionを決定し、メインシェーダーを派手なもので変更します(バイアス行列* lightCamera行列*頂点、sampler2Dshadowなど)
5.もちろん、すべてを統一して何かをします。
そして今、レンダーループ
1.もちろん、すべてを統一し、(もう一度)何かをします。
2. FBOをバインドし、小さなシェーダーをバインドglViewport(0, 0, 1024, 1024)
します、、 colorMaskをfalseにバインドし、深度バッファーをクリアしますglCullFace(GL_FRONT)
、、glBindTexture(GL_TEXTURE_2D, 0)
3.頂点位置属性のみを使用してすべてを完全に無料でレンダリングします
4. FBOのバインドを解除し、プログラムをメインシェーダー(派手なものを含むもの)に再バインドしglViewport
、colorMaskを有効にします。glCullFace(GL_BACK)
5.sampler2DShadow
「バインドしたり、均一にしたり、触れたりしないので、メインシェーダーがどうなるか」を考えずに、通常どおりにシーンをレンダリングします。
6.数え切れないほどのグリッチ、バグ、ピクセル乱交を見る
実際、サンプラーにdepthTextureを均一にしようとしましたが、黒い画面しかありません。また、FBOをレンダリングしなくても、レンダリングすると同じ画像が表示されます。
誰かが説明できますか、私は何が欠けていますか?
シェーダーがディフューズテクスチャをディフューズテクスチャとdepthTextureの2回使用しているように感じますが、そのdepthTextureを与える方法がわかりません。