阴影贴图透视别名

时间:2014-05-23 19:13:42

标签: c++ opengl shadow shadow-mapping

当表面几乎与光线方向平行时,似乎无法消除这种透视锯齿。

我测试了几种不同的阴影祛痘技术:

  • 持续偏见不起作用:在大到足以消除问题的偏见上引入彼得平移
  • 斜坡尺度偏差不能完全发挥作用,只会略微减轻问题
  • 正常偏移阴影不起作用,并引入额外的阴影变形
  • glPolygonOffset不起作用,我怀疑它与斜率偏差相同
  • PCL只是略微反对模式,并没有真正解决问题。杀死模式所需的过滤量会产生巨大的斑点阴影
  • VSM做得不多,只是稍微改变模式
  • 增加阴影贴图分辨率和像素深度可以减轻问题,但是足以完全解决问题的分辨率会大大降低帧速率
  • 为阴影贴图创建扩展投影变换的近和远平面也没有做任何事情

从查看我在Google和我的书中找到的所有内容看来,这基本上是一个无法解决的问题。我知道必须有办法解决它,因为即使是一些独立游戏也有完美而流畅的阴影贴阴影。

是否有人愿意分享这个秘密?

1 个答案:

答案 0 :(得分:1)

也许你已经找到了答案,因为这个问题已经有三年了,但是我仍然想说平行于光线方向的表面上的瑕疵必须用正常偏移来固定。至少我刚用这种方法解决了同样的问题。这是

vec4 shadowPosition = lightMatrix * vec4(_position, 1.0);
float bias = 0.0002;
float visibility = (texture(shadow, shadowPosition.xy / 2. + .5).r - .5) * 2. < shadowPosition.z - bias ? 0.1: 1.0;

rendering artifacts

现在是

float bias = 0.02;
vec4 shadowPosition = lightMatrix * vec4(_position + _normal * bias, 1.);
float visibility = (texture(shadow, shadowPosition.xy / 2. + .5).r - .5) * 2. < shadowPosition.z ? 0.1: 1.0;

artifacts are gone

是的,影子的边界现在是锯齿状的,但我希望其他一些技巧可以帮助我以后顺利进行。