さて、シャドウマップとは何ですか?シャドウマップは、テクセルが単純な質問に答えるテクスチャです。テクセルによって表される方向に沿って、ライトからどのくらいの距離でライトが遮られますか?テクスチャ座標は、特定のシャドウマッピングアルゴリズムに応じて、さまざまな射影テクスチャリング手段を使用して生成されます。
射影テクスチャリングは、単にオブジェクトをテクスチャの空間に変換する方法です(そしてもちろん、私はそれが逆に聞こえることを知っています。しかしそれはそれがどのように機能するかです)。シャドウマッピングアルゴリズムは、いくつかの異なる種類の変換を使用します。しかし、最終的には、これらは1つの空間から別の空間への単なる変換です。
シャドウマップをレンダリングするときは、ジオメトリの頂点を取り、標準のレンダリングパイプラインを介してそれらを変換します。ただし、カメラと投影行列は、ビューの位置と方向ではなく、ライトの位置と方向に合わせて設計されています。
シャドウマップを使用してフォワードレンダリングを行う場合は、オブジェクトを通常どおりにレンダリングし、頂点をビューカメラスペースに変換し、ビューの投影行列を通過させます。ただし、ライトカメラと投影マトリックスを介して頂点を変換し、頂点ごとのデータとしてフラグメントシェーダーに渡します。投影テクスチャリングを介してそれらを使用して、シャドウテクスチャにアクセスします。
ここが重要なポイントです。射影テクスチャアクセスは、テクスチャ上でアクセスする場所が、サーフェス上のそのポイント(フラグメントシェーダーでレンダリングしているポイント)とライトの間の方向を表すように設計されています。したがって、レンダリングされるフラグメントでオクルージョンが発生する深度を表すテクセルをフェッチします。
しかし、このパイプラインについて特別なことは何もありません。頂点の位置をシャドウテクスチャに変換してフラグメントシェーダーに渡す必要はありません。ワールドスペースの頂点位置をフラグメントシェーダーに渡し、フラグメントシェーダーにそれらをシャドウテクスチャの射影空間に変換させることができます。確かに、まったく同じテクスチャ座標が得られるので、多くのパフォーマンスを捨てることになります。しかし、それは数学的に実行可能です。
実際、ビューカメラ空間の頂点位置をフラグメントシェーダーに渡すことができます。次に、それらをワールドに変換し、次にライトカメラ空間に変換し、次に射影シャドウテクスチャ空間に変換します。そのすべての変換を1つの行列に入れることができます(影の投影アルゴリズムによって異なります)。繰り返しますが、これにより以前とまったく同じものが得られます。そのため、フォワードレンダリングを実行する理由はありません。
ただし、遅延レンダリングでは、すでにカメラ空間の頂点位置を表示しています。そうでなければ、照明を行うことができません。あなたはそれらをバッファに書き込むことによって大量のメモリと帯域幅を無駄にしたか、またはあなたは賢く、深度バッファとさまざまな数学を使用してそれらを再計算しました(ここでは説明しませんがオンラインでカバーされています)。
どちらの方法でも、ビューカメラ空間の位置があります。また、前述のように、マトリックスを適用して、ビューカメラ空間からシャドウ投影テクスチャ空間に変換できます。だから...それをしてください。次に、シャドウマップにアクセスします。
問題が解決しました。