合作伙伴和我正在开发OpenGL的小型演示。我们正在进行简单的阴影贴图。他使用ATI和Intel HD图形4000,一切正常。我使用GTX 560 TI并获得阴影痤疮,尽管我们使用相同的代码。
当我移动时,整个阴影都在闪烁。要设置帧缓冲区的深度缓冲区,我们执行以下操作:
glBindTexture(GL_TEXTURE_2D,_t_depth->name());
glTexImage2D(
GL_TEXTURE_2D,0,
GL_DEPTH_COMPONENT32,
width,height,
0, GL_DEPTH_COMPONENT, GL_FLOAT,0);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
glBindTexture(GL_TEXTURE_2D,0);
glFramebufferTexture(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,_t_depth->name(),0);
顶点着色器的相关部分是:
uniform mat4 u_lightspace_MVP;
layout(location=0) in vec3 v_position;
...
vec4 shadowcoord_x=u_lightspace_MVP*vec4(v_position,1.0);
shadowcoord_x/=shadowcoord_x.w;
片段着色器的相关部分是:
if (texture(s_shadowMap,shadowcoord_x.xy).r>shadowcoord_x.z-0.0001)
我尝试了不同的偏差值,但要么它不会影响痤疮,要么根本没有阴影。我还尝试使用sampler2DShadow和textureProj()以及texture()作为查找函数。似乎没什么用。此问题不仅影响阴影,还影响使用阴影贴图的体积光照效果。 另一方面,使用gl_ClipDistance剪辑在我的Nvidia上工作正常但在他的图形卡上没有。
答案 0 :(得分:1)
经过进一步的试验和错误接近后,我终于摆脱了痘痘。我唯一要做的就是将阴影贴图的精度从32位减半到16位。初始化现在看起来像这样:
glBindTexture(GL_TEXTURE_2D,_t_depth->name());
glTexImage2D(
GL_TEXTURE_2D,0,
GL_DEPTH_COMPONENT16,
width,height,
0, GL_DEPTH_COMPONENT, GL_FLOAT,0);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
glBindTexture(GL_TEXTURE_2D,0);
glFramebufferTexture(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,_t_depth->name(),0);
现在我也在片段着色器中使用sampler2DShadow和textureProj()进行深度测试,一切正常。 我仍然很好奇为什么它在我的Nvidia上不能使用32位而是在ATI上。