我正在尝试实现级联阴影贴图,但当我想要访问每个视锥体分区对应的深度纹理时,出现了一个错误。
更具体地说,我的问题出在当我想要选择正确的阴影纹理时,如果我尝试使用下面的代码,我会得到像这张图片中一样的伪影效果。您正在看一个立方体的阴影,伪影是被切割视锥体限制(红色表示近端剪裁面,绿色表示远端剪裁面)之间的小点/正方形。
uniform sampler2D shadowMaps[10]; //GL_TEXTURE5
uniform float cameraFrustumZPartitionning[10];
uniform int cameraFrustumSize;
int getCSMlevel(float Z){
for(int iZ = 0 ; iZ < cameraFrustumSize; ++iZ)
if(Z < cameraFrustumZPartitionning[iZ])
return iZ;
return -1;
}
float ShadowCalculation(vec4 fragPosLightSpace[3], int shadowMapId, float NdotD) //WIP
{
int csmLevel = getCSMlevel(ClipSpacePosZ);
vec4 fragPosLS = fragPosLightSpace[csmLevel];
vec3 projCoords = fragPosLS.xyz / fragPosLS.w;
// Transform to [0,1] range
projCoords = projCoords * 0.5 + 0.5;
float closestDepth = 0.0;
if(csmLevel == -1)
return 0.0;
closestDepth = texture(shadowMaps[csmLevel], projCoords.xy).r;
return 1.0 - ((projCoords.z > closestDepth)?1.0:0.0);
}
如果我尝试这个代码,一切都很好。
uniform sampler2D shadowMaps[10]; //GL_TEXTURE5
uniform float cameraFrustumZPartitionning[10];
uniform int cameraFrustumSize;
int getCSMlevel(float Z){
for(int iZ = 0 ; iZ < cameraFrustumSize; ++iZ)
if(Z < cameraFrustumZPartitionning[iZ])
return iZ;
return -1;
}
float ShadowCalculation(vec4 fragPosLightSpace[3], int shadowMapId, float NdotD) //WIP
{
int csmLevel = getCSMlevel(ClipSpacePosZ);
vec4 fragPosLS = fragPosLightSpace[csmLevel];
vec3 projCoords = fragPosLS.xyz / fragPosLS.w;
// Transform to [0,1] range
projCoords = projCoords * 0.5 + 0.5;
float closestDepth = 0.0;
if(csmLevel == 0)
closestDepth = texture(shadowMaps[0], projCoords.xy).r;
else if(csmLevel == 1)
closestDepth = texture(shadowMaps[1], projCoords.xy).r;
else if(csmLevel == 2)
closestDepth = texture(shadowMaps[2], projCoords.xy).r;
else
return 0.0;
return 1.0 - ((projCoords.z > closestDepth)?1.0:0.0);
}
在GLSL中,我们可以制作sampler2D的数组,并通过使用变量访问该数组来获取正确的值,或者我在这里犯了一个巨大的错误?