シャドウマッピングのバイアス行列について混乱しました。この質問によると:シャドウマッピングのバイアス行列、バイアス行列はスケールダウンして[0..1]xと[0..1]yに変換するために使用されます。バイアスマトリックスを使用しない場合、テクスチャは1/4のシーンサイズで埋められると思いますか?本当?それともここに魔法がありますか?
1 に答える
完全ではありませんが、結果は同じです。あなたがリンクした質問からの答えが言ったように。wを除算した後、座標はNDC空間にあり、[-1、1](x、y、z)の範囲でエルゴします。これで、テクスチャからサンプリングする場合、指定する必要のある座標は「テクスチャスペース」にあり、OpenGLはそのスペースを[0、1]の範囲に定義しました(少なくとも2Dテクスチャの場合)。x = 0 y = 0はテクスチャの左下、x = 1 y=1はテクスチャの右上です。
つまり、レンダリングされた深度テクスチャからサンプリングする場合、計算されたテクスチャ座標を[-1、1]から[0、1]に変換する必要があります。これを行わないと、テクスチャはきれいになりますが、実際にサンプリングしたい範囲に入るのは座標の4分の1だけです。
OpenGLは座標をNDCからウィンドウ座標(この場合はウィンドウがテクスチャであり、正しい変換に使用します)に変換するため、レンダリングするオブジェクトをデプステクスチャにバイアスする必要はありません。glViewport
テクスチャ座標にバイアスを適用するには、テクスチャバイアス行列を使用し、それを投影行列で乗算することができるため、シェーダーはそれについて心配する必要がありません。あなたがリンクした投稿はすでにそのマトリックスを与えました:
const GLdouble bias[16] = {
0.5, 0.0, 0.0, 0.0,
0.0, 0.5, 0.0, 0.0,
0.0, 0.0, 0.5, 0.0,
0.5, 0.5, 0.5, 1.0};
行列が列メジャーである場合、この行列は[-1、1]を[0、1]に変換する必要があり、最初に0.5を掛けてから、0.5を加算します。行列が行メジャーである場合は、行列を転置するだけで問題ありません。
これがお役に立てば幸いです。