Opengl 级联阴影映射查找决策/gl_FragCoord.z 我已经实现了在英伟达SDK中的级联阴影映射(http://developer.download.nvidia.com/SDK/10.5/Samples/cascaded_shadow_maps.zip). 然而,我的查找似乎不起作用

Opengl 级联阴影映射查找决策/gl_FragCoord.z 我已经实现了在英伟达SDK中的级联阴影映射(http://developer.download.nvidia.com/SDK/10.5/Samples/cascaded_shadow_maps.zip). 然而,我的查找似乎不起作用,opengl,glsl,Opengl,Glsl,这是一张描述我当前状态的照片: 问题是,即使我离第一次分手很远,我也会马上进入第一次分手。正如您所看到的,其他拆分甚至没有被考虑 我想这可能是因为主机使用了不同的投影矩阵。它与我提供给算法的不同,但我也尝试将相同的矩阵传递给着色器,并通过以下方式进行计算:gl_Position=matProj*gl_ModelViewMatrix*gl_Vertex 但这并没有改变任何事情。我最后还是只有一次分手 以下是我的着色器: [顶点] varying vec3 vecLight; varying vec

这是一张描述我当前状态的照片:

问题是,即使我离第一次分手很远,我也会马上进入第一次分手。正如您所看到的,其他拆分甚至没有被考虑

我想这可能是因为主机使用了不同的投影矩阵。它与我提供给算法的不同,但我也尝试将相同的矩阵传递给着色器,并通过以下方式进行计算: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;
浮动阴影=纹理2d(smap_3,sm_coord_c.xy).x;
浮点数s=(阴影
因此,出于某种原因,gl_FragCoord.z比vecFarbound.x小,无论我在场景中的哪个位置。(还要注意最左边的阴影区域,这一区域随着我移动摄影机的高度增加而增加,并很快占据了整个场景。)

我已经检查了向量界值,它们与nvidia代码中的值相似,所以我认为我计算的是正确的


有没有办法检查gl_FragCoord.z的值?

在我以前的csm实现中,我只是使用相机空间中的距离

float tempDist = 0.0;
tempDist = dot(EyePos.xyz, EyePos.xyz);
if (tempDist < split.x) ...
else if (tempDist < split.y) ...
...
float tempDist=0.0;
tempDist=点(EyePos.xyz,EyePos.xyz);
如果(tempDist
Thsi解决方案对我来说更简单一些,我可以更好地控制分裂。使用Z值(在剪辑空间中)时,可能会因为Z值不是线性的而出现一些问题


我建议在viewSpace中进行拆分测试,然后(如果可行的话)使用gl_FragCoord.z..

酷,我会试试这个!非常感谢,这部分我真的很吃力。我很快就回来报告。请问你是如何计算分裂向量的?现在我基于每个分割的z值和投影矩阵。你的建议似乎对我不起作用。我基于在viewSpace中给出拆分的位置,并使用建议的方程式设置拆分。。。。请看此链接中的“实际分割方案”。对不起,到目前为止还没有时间尝试。我以同样的方式计算这些分割,对于我当前的设置,zNear从1.0f开始,zFar变为100.0f,这将产生3个分割值:12.XXf、33.XXf和100.0f。我将这些值发送到着色器,并将其与眼睛距离进行比较(如上文所述)这样的结果是:蓝色代表什么,啊,我也得把裂口弄平,不是吗?
float tempDist = 0.0;
tempDist = dot(EyePos.xyz, EyePos.xyz);
if (tempDist < split.x) ...
else if (tempDist < split.y) ...
...