3

当表面几乎平行于光的方向时,似乎不可能消除这种透视锯齿。

我测试了几种不同的暗影粉刺去除技术:

  • 恒定偏差不起作用:在足够大的偏差上引入彼得平移以消除问题
  • 斜率偏差不能完全起作用,只会稍微减轻问题
  • 正常偏移阴影不起作用,并引入额外的阴影变形
  • glPolygonOffset 不起作用,我怀疑它与斜率比例偏差相同
  • PCL 只是稍微消除了图案的锯齿,实际上并没有解决问题。消除模式所需的过滤量会产生巨大的斑点阴影
  • VSM 做的不多,只是稍微改变了模式
  • 增加阴影贴图分辨率和像素深度可以减轻问题,但分辨率足够大以完全解决问题会显着降低帧速率
  • 为创建阴影贴图扩展投影变换的近平面和远平面也无济于事

从我在谷歌和我的书中可以找到的所有内容来看,这基本上是一个无法解决的问题。不过我知道一定有办法绕过它,因为即使是一些独立游戏也有完美而平滑的阴影贴图阴影。

有人愿意分享这个严密的秘密吗?

4

1 回答 1

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;

渲染工件

现在是

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;

文物不见了

是的,阴影的边界现在是锯齿状的,但我希望其他一些技术可以帮助我稍后平滑它。

于 2017-07-08T22:30:56.293 回答