2012-05-06 9 views
3

私は、nvidia SDK(http://developer.download.nvidia.com/SDK/10.5/Samples/cascaded_shadow_maps.zip)のようにカスケードシャドーマッピングを実装しました。しかし、私のルックアップは動作していないようです。本家の私は遠く離れてそれからだhttp://i.imgur.com/SCHDO.pngカスケードシャドウマッピングルックアップ決定/ gl_FragCoord.z

問題があるが、私はすぐに最初の分割に終わる:

は、ここに私の現在の状態を描いた絵です。ご覧のように、他の分割は考慮されていません。

私は、これは主エンジンが使用している別の投影行列から来ていると考えました。アルゴリズムと同じですが、同じ行列をシェーダに渡してこのように計算してみました。gl_Position = matProj * gl_ModelViewMatrix * gl_Vertex これは実際には変更されませんでした。私はまだ1つの分割だけで終わった。ここで

は私のシェーダです:

[頂点]

varying vec3 vecLight; 
varying vec3 vecEye; 
varying vec3 vecNormal; 
varying vec4 vecPos; 
varying vec4 fragCoord; 
void main(void) 
{ 
    vecPos = gl_Vertex; 
    vecNormal = normalize(gl_NormalMatrix * gl_Normal); 
    vecLight = normalize(gl_LightSource[0].position.xyz); 
    vecEye = normalize(-vecPos.xyz); 

    gl_TexCoord[0] = gl_MultiTexCoord0; 
    gl_Position = ftransform(); 
} 

[フラグメント](ちょうど影の部分)

vec4 getShadow() 
{ 
    vec4 sm_coord_c = texmat_3*vecPos; 
    float shadow = texture2D(smap_3, sm_coord_c.xy).x; 
    float s = (shadow < sm_coord_c.z) ? 0.0 : 1.0; 

    vec4 shadow_c = vec4(1.0, 1.0, 1.0, 1.0) * s; 

    if(gl_FragCoord.z < vecFarbound.x) 
    { 
     vec4 sm_coord_c = texmat_0*vecPos; 
     float shadow = texture2D(smap_0, sm_coord_c.xy).x; 
     float s = (shadow < sm_coord_c.z) ? 0.0 : 1.0; 

     shadow_c = vec4(0.7, 0.7, 1.0, 1.0) * s; 
    } 
    else if(gl_FragCoord.z < vecFarbound.y) 
    { 
     vec4 sm_coord_c = texmat_1*vecPos; 
     float shadow = texture2D(smap_1, sm_coord_c.xy).x; 
     float s = (shadow < sm_coord_c.z) ? 0.0 : 1.0; 

     shadow_c = vec4(0.7, 1.0, 0.7, 1.0) * s; 
    } 
    else if(gl_FragCoord.z < vecFarbound.z) 
    { 
     vec4 sm_coord_c = texmat_2*vecPos; 
     float shadow = texture2D(smap_2, sm_coord_c.xy).x; 
     float s = (shadow < sm_coord_c.z) ? 0.0 : 1.0; 

     shadow_c = vec4(1.0, 0.7, 0.7, 1.0) * s; 
    } 

    return shadow_c; 
} 

ので、いくつかの理由で、gl_FragCoord.zがより小さく、 vecFarbound.xシーンのどこにいようと私はしています。 (また、左端の影の部分に注目してください。カメラを動かしてすぐにすべてのシーンを引き継ぎます。)

私はvecFarboundの値をチェックしました。 nvidiaのコードので、私はそれらを正しく計算したと仮定します。

gl_FragCoord.zの値を確認する方法はありますか?私が理解するカメラ空間での私の古いCSMの実装私は単に使用距離で

答えて

1

float tempDist = 0.0; 
tempDist = dot(EyePos.xyz, EyePos.xyz); 
if (tempDist < split.x) ... 
else if (tempDist < split.y) ... 
... 

Thsiソリューションは少しsimplierだったと私は分割をより良くコントロールを得ました。 Z値(クリップスペース内)を使用すると、z値が非線形であることに起因するいくつかの問題が生じる可能性があります。

私はクール

+0

.. viewSpaceでスプリットテストをやって提案し、その後、(それが動作するかどうか)gl_FragCoord.zを使用し、私はこれを試してみますよ!ありがとう、私は本当にこの部分で苦労しています。私はすぐに報告します。 – Lngly

+0

分割ベクトルの計算方法を尋ねてもいいですか?今、私は、各分割と投影行列のZ値に基づいています。私の提案にはうまくいかないようです。 – Lngly

+0

私はhttp://http.developer.nvidia.com/GPUGems3/gpugems3_ch10.htmlに基づいています。分割は、viewSpaceで与えられ、提案された式を使用して設定されます。このリンクの「The Practical Split Scheme」を見てください。 – fen