2011-07-28 5 views
0

シェーダにsampler2DShadowがあり、シャドウマッピングを実装するために使用したいと思います。 GL_TEXTURE_COMPARE_MODEがGL_COMPARE_R_TO_TEXTUREに設定され、GL_TEXTURE_COMPARE_FUNCがGL_LEQUALに設定されている(つまり、座標のr値がテクスチャでフェッチされた深度値よりも小さいか等しい場合、比較結果が1になるはずです)。このテクスチャは、ライトスペース座標でレンダリングされたFBOのGL_DEPTH_ATTACHMENTにバインドされています。texture2D関数による自動比較を使用したシャドウマップテクスチャからのデータのサンプリング

最後のフラグメントシェーダでtexture2D関数にどのような座標を割り当てる必要がありますか?私は現在、

light_vert_pos

vec4でなめらかな

機能により頂点シェーダで定義されている私のフラグメントシェーダでセット

light_vert_pos = light_projection_camera_matrix *モデルビュー* in_Vertexを持っています。

私は値

にTexture2D(シャドウマップ、(light_vert_pos.xyz)/light_vert_pos.w)

が、これは動作していないようで、私のライティングを掛けることができ引き受けます。 light_vert_posは射影座標(ポストプロジェクティブ座標)にしかないので(FBOにデプスバッファを作成するために使用する行列です)、手動で3つのx/y/z変数を[0,1]にクランプする必要がありますか?

+0

深度テクスチャに正しい画像が含まれていることを確認します。 – kvark

答えて

2

深度値の生成方法については言及していません。だから、私は通常の投影を使って三角形を描くことによって深度値を生成したと仮定します。つまり、ジオメトリをカメラ空間に変換し、それを投影空間に変換し、ラスタライズパイプラインが正常にそこから処理するようにします。

シャドウマッピングを行うには、テクスチャの座標がラスタライザの座標と一致している必要があります。

頂点シェーダの出力はクリップスペースです。そこから、パースペクティブ分割を取得し、次にビューポート変換を行います。後者は、glViewportとglDepthRangeの値を使用して、ウィンドウスペースXYZを計算します。ウィンドウ空間Zは、深度バッファに書き込まれた深度値である。

これは深度パス中のすべてです:シャドウマップの深度値の生成。

ただし、いくつかのショートカットを使用することができます。 glViewportの範囲がテクスチャと同じサイズに設定されている場合(一般的にどのように行われているか)、ビューポート変換は無視できます。深度パスで使用したglDepthRangeが必要です。

フラグメントシェーダでは、座標を標準化されたデバイス座標(NDC)空間に配置するパースペクティブ分割を実行できます。その空間はすべての方向で[-1、1]です。あなたのテクスチャ座標は、次の2つでXとYを分割し、それらに0.5を追加する必要が[0、1]、ようです:Z値を計算するには

vec3 ndc_space_values = light_vert_pos.xyz/light_vert_pos.w 
vec3 texCoords; 
texCoords.xy = ndc_space_values.xy * 0.5 + 0.5; 

を、あなたは近くと遠くの値を知っておく必要がありますglDepthRangeに使用してください。

texCoords.z = ((f-n) * 0.5) * ndc_space_values.z + ((n+f) * 0.5); 

どこnfは近くglDepthRangeと遠く値です。もちろん、これらを事前計算して制服として渡すこともできます。または、デフォルトの範囲をnear = 0、far = 1を使用する場合は、

texCoords.z = ndc_space_values.z * 0.5 + 0.5; 

のようになります。別に

あなたはinはなくvaryingであなたの入力を定義しているので、あなたはGLSL 1.30以上を使用してする必要があります。では、なぜtextureではなく、texture2D(これは古い関数)を使用していますか?

+0

本当にありがとうございます、それは完全に動作します。私は最初からtexture()を使っていました(glsl 4.1を使用していますが)ここでtexture2D()を書いた答えを探している間に私が訪れたフォーラムでは、texture2D()私の間違い:) – Tuxer

関連する問題