2011-07-19 7 views
4

私は現在、C++のOpenGLエンジンにシャドウマッピング(カスケードシャドウマッピング、正確には)をプログラミングしています。私は、光源とシャドウマップの各ピクセルとの距離を含むテクスチャを作成したいと考えています。どのテクスチャタイプを使用すべきですか?OpenGLシャドウマッピングのテクスチャに頂点の奥行き情報を格納

GL_DEPTH_COMPONENTテクスチャの内部フォーマットがありますが、テクスチャに与えたいデータを[0,1]にスケールします。本当の長さを取り戻すために私の最終的なレンダリングの間にシャドーマップを作成した後、私は一度自分の長さを反転させるべきですか?それは全く役に立たないようです!

テクスチャを使用して長さを反転することなく2回保存する方法はありますか? (テクスチャ作成時に1回、使用中に1回)。

+1

私はあなたの古いアカウントをこのアカウントにマージしました。あなたの投稿を編集し、好きなだけコメントを残すことができます。 –

+0

ありがとう:)私はついに彼のソリューションを受け入れた! – Tuxer

答えて

4

逆の場合はどういう意味なのか分かりません(これはうまくいかないため距離を逆転させることはできません)。あなたがするのは、光源との距離を[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しかありませんが、あなたの質問については、シェーダーを使用していると仮定します。

関連する問題