逆の場合はどういう意味なのか分かりません(これはうまくいかないため距離を逆転させることはできません)。あなたがするのは、光源との距離を[0,1]の範囲に変換することです。
これは、光源のビューのための通常の投影行列を構築し、これをシャドウマップ構築パスの頂点に適用することによって行うことができます。このようにして、光源との距離が深度バッファ(glCopyTexSubImage
またはFBOのいずれかでGL_DEPTH_COMPONENT
フォーマットのテクスチャを接続できる)に書き込まれます。最後のパスではもちろん、同じ投影行列を使用して投影的テクスチャリング(GLSLを使用する場合はsampler2DShadow
サンプラを使用)を使用してシャドウマップのテクスチャ座標を計算します。
しかし、この変換は線形ではありません。これは、深度バッファがビューア(またはこの場合は光源)の近くで精度が高くなるためです。別の欠点は、距離値の有効範囲(光源が最も遠い点)を知る必要があることです。シェーダを使って、この距離を光源までの距離をこの最大距離で除算するだけで、この変換を線形にすることができます。これをフラグメントの深さの値(GLSLのgl_FragDepth
)に手動で割り当てます。 「反転」する。
光の距離に浮動小数点テクスチャを使用し、距離をカラーチャンネルとして書き込んだり、最後のパスで深度比較を自分自身で行うことで、除算(および最大距離の知識)を防ぐことができます通常sampler2D
)。しかし、浮動小数点テクスチャを線形フィルタリングすることは、新しいハードウェアでのみサポートされています。これがフラグメントごとに1つの除算より速いかどうかはわかりません。しかし、この方法の利点は、これが(分散精度のために)通常のubyteテクスチャではうまく動作せず、深度テクスチャでもうまく動作しない「分散シャドウマップ」のようなものへの道を開くことです。 (GL_DEPTH_COMPONENT
は、少なくとも16ビットの精度でなければならないとしてneccessary精度に欠け、)と(その高速または完全に古いハードウェアでサポートされていない)テクスチャを浮くので、合計する
、GL_DEPTH_COMPONENT
はUBYTEテクスチャの間にちょうど良い妥協点です。しかし、固定小数点形式のため、あなたは[0,1] - 範囲(射影の線形である)への変換を回避することはありません。浮動小数点テクスチャが高速であるかどうかはわかりませんが、浮動小数点テクスチャと1〜2個のコンポーネント浮動小数点テクスチャとレンダーターゲットの線形(または3線形)フィルタリングをサポートする最新のハードウェアを使用している場合は、それは試してみる価値があるかもしれません。
もちろん、固定機能パイプラインを使用している場合は、オプションとしてGL_DEPTH_COMPONENT
しかありませんが、あなたの質問については、シェーダーを使用していると仮定します。
私はあなたの古いアカウントをこのアカウントにマージしました。あなたの投稿を編集し、好きなだけコメントを残すことができます。 –
ありがとう:)私はついに彼のソリューションを受け入れた! – Tuxer