我已经在 nvidia SDK (http://developer.download.nvidia.com/SDK/10.5/Samples/cascaded_shadow_maps.zip) 中实现了级联阴影映射。但是我的查找似乎不起作用。
这是描绘我当前状态的图片:http: //i.imgur.com/SCHDO.png
问题是,即使我离它很远,我也会立即进入第一次分裂。如您所见,甚至没有考虑其他拆分。
我认为这可能来自主引擎使用的不同投影矩阵。它与我提供给算法的不同,但我也尝试将相同的矩阵传递给着色器并以这种方式计算: 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 的值?