opengl - Nvidia 显卡上的阴影痤疮

标签 opengl glsl nvidia ati shadow-mapping

我和一个合作伙伴正在用 OpenGL 制作一个小型演示。我们正在做简单的阴影贴图。他使用 ATI 和 Intel HD Graphics 4000,一切正常。我使用 GTX 560 TI,尽管我们使用相同的代码,但还是出现了阴影痤疮。 enter image description here

当我移动时,整个阴影都会闪烁。要设置帧缓冲区的深度缓冲区,我们执行以下操作:

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 上工作正常,但在他的显卡上却不行。

最佳答案

经过进一步的尝试和错误方法,我终于摆脱了痤疮。我唯一要做的就是将阴影贴图的精度从 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 上运行。

关于opengl - Nvidia 显卡上的阴影痤疮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23709577/

相关文章:

opengl - 无法链接已编译的着色器 (GLSL)

algorithm - 三角形图案 GLSL 着色器

android - Android 3.x/Google TV/SDK 上的视频处理 : Video frame to SurfaceTexture/OpenGL/GLSL

CUDA:两个数字相加给出错误答案

opengl - 如何使用 Mipmapping 将 CUDA 生成的 PBO 复制到纹理

opengl - 如何实现地面雾 GLSL 着色器

linux - OpenCL 不显示 Nvidia GPU

testing - 无法构建 CUDA 测试应用程序

algorithm - 将多个 .OBJ 索引缓冲区映射/折叠到 OpenGL 的第一个索引缓冲区

opengl - 在 OpenGL 中绑定(bind)纹理