2012-05-06 2 views
3

nvidia SDK (http://developer.download.nvidia.com/SDK/10.5/Samples/cascaded_shadow_maps.zip)에서와 같이 Cascaded Shadow Mapping을 구현했습니다. 그러나 내 조회 그냥 작동하지 않는 것. 바로 그겁니다 내가 멀리 그것에서 해요 http://i.imgur.com/SCHDO.png계단식 그림자 매핑 조회 결정/gl_FragCoord.z ​​

문제는, 내가 바로 첫 번째 분할에 결국 :

여기에 내 현재 상태를 묘사하는 사진입니다. 보시다시피, 다른 분할은 고려조차되지 않습니다.

이 이유는 주 엔진이 사용하는 다른 프로젝션 매트릭스에서 비롯된 것이라고 생각했습니다. 그것은 내가 알고리즘에 공급하는 것과는 다르지만, 같은 행렬을 쉐이더에 전달하여이 방법으로 계산을 시도했습니다. gl_Position = matProj * gl_ModelViewMatrix * gl_Vertex 정말 그 일을 변경하지 않았습니다. 나는 여전히 단 하나의 분열로 끝났다. 여기

내 쉐이더 같습니다

[정점]

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 솔루션은 조금 더 간단이었다 카메라 공간에서 거리를 사용했다. Z 값 (클립 공간에서)을 사용하면 z 값이 비선형이라는 문제가 발생할 수 있습니다. 나는 (그것이 작동하는 경우) gl_FragCoord.z을 사용하여 다음과, viewSpace에 분할 테스트를하고 제안

..

+0

멋진,이 밖으로 시도 할 것이다! 고마워,이 부분과 정말 고심하고있다. 나는 곧 다시보고 할 것이다. – Lngly

+0

분할 벡터를 어떻게 계산했는지 물어봐도 될까요? 지금은 각 분할과 투영 행렬의 z 값을 기준으로합니다. 너의 제안과 함께 나를 위해 일하지 않는 것. – Lngly

+0

나는 http://http.developer.nvidia.com/GPUGems3/gpugems3_ch10.html에 기반을두고 있는데, 여기서는 나누기가 viewSpace에 주어지고 제안 된 수식을 사용하여 설정됩니다 ....이 링크의 "The Practical Split Scheme"을보십시오. – fen