在阴影映射中处理投影别名


15

我不喜欢简单的过程3D建模,以制作用于3D打印的小建筑物。一个例子:

建筑物


为了使模型在屏幕上更具可读性,我为单个定向光实现了基本的阴影映射。由于我的场景没有变化,因此我只使用场景的轴对齐框渲染一次阴影贴图,以找出阴影贴图的边界。阴影和边界看起来像我已经正确放置了所有矩阵,但是再靠近一点看起来就很糟糕:

塔的特写

从我读过的书中,我了解了彼得平移以及我可能会做些什么,但是我认为这是投影别名的一种形式,参差不齐的边缘看起来非常糟糕,以至于我认为基本实现中有问题。

我修改了像素着色器以显示阴影纹理边界:

显示特塞尔边界

我在纹理上进行了双线性过滤(没有它,我会出现严重的暗疮痤疮)。可悲的是,我对PCF的尝试也失败了-它看起来同样参差不齐:

在此处输入图片说明

这是禁用了双线性过滤的单个示例案例:

在此处输入图片说明

这看起来像“典型的”投射混叠吗?是否可以使用截锥体的场景(可能会进行级联)剪切视景的动态渲染来解决该问题?

编辑:添加双线性过滤的特写,阴影比较后,只是为了展示我得到的。由于内部边缘,阴影暗疮出现。我正在使用堆叠的虚拟块进行建模,但未执行正确的联合操作。根据我的阅读,在多面体上执行布尔运算并非易事,但也将允许我实现静态阴影量以及清理某些3D打印软件。

双线性滤波

Answers:


10

具有可接受质量的阴影贴图是一个漫长的旅程。因此,您实现了第一步-基本的阴影图,该图静态地涵盖了整个场景。这意味着光视图空间中的阴影贴图纹理像素大小与摄影机视图空间中渲染场景的纹理像素大小之比很大,从而导致混叠。为了使该比率降低到接近1:1,您提到了以下技术:

  • 最简单的方法是增加阴影贴图的大小,以找到具有最佳性能的值,
  • 将阴影贴图与相机视图视锥对齐。然后,阴影贴图会覆盖场景的较小部分,因此可以减少锯齿,
  • 可以将其改进为CSM,其功能相同,但是您需要基于视锥的每个切片的中心为每个级联使用不同的光视图矩阵中心位置渲染场景。

平滑阴影边缘的一些基本技术:

  • 显然是PCF,但建议您将PCF实现与内置的硬件PCF(在Opengl中使用sampler2DShadow)结合起来。这样一来,您可以减少循环迭代次数,并降低PCF的价格,
  • 可以使用旋转的泊松圆盘将边缘的不平整性换成噪声。PCF循环的每次迭代都会随机旋转用于从阴影贴图采样的采样。

您还可以研究边缘平滑技术,例如:

  • 将阴影映射渲染到MSAA应用的帧缓冲区,
  • 通过插值进一步增强PCF ,
  • 随着时间融合的样本数量不断增加。

PCF基本技术遭受阴影痤疮的困扰,可以通过在阴影测试中应用一些偏移来修复该问题。计算此偏移量的大小也是研究领域

其他更高级的阴影贴图方法包括:

  • 指数阴影贴图方差阴影贴图 -在大多数情况下,它们不会遭受暗疮痤疮的困扰,并且可以提供平滑的边缘而不会产生阻塞,但是会增加某些光泄漏情况的成本,
  • 指数方差阴影贴图-可能是2D深度图阴影贴图的最先进技术,结合了VSM的极佳平滑度并解决了光泄漏问题,而内存使用量却增加了一倍,
  • 百分比更近的柔和阴影 -基本技术,可通过改变半影大小来增强传统阴影贴图,
  • 多视图阴影贴图 -某种技术的多个阴影贴图,排列在面光源上,用于计算具有不同半影大小的逼真的柔和阴影,
  • Deep Shadow Maps-用于增强阴影的体积散射,
  • 实时射线追踪阴影-可能是未来。

您没有在PCF上失败过,它看起来像这样:)

我希望有一种方法可以在相机视图空间的阴影贴图上应用高斯模糊,但是这种方法无法正常工作。


部分该评论被感谢您的回答,所以我想我应该让你知道,因为你不会得到那里的通知。
trichoplax

是的,我看到了,但是谢谢。
narthex

1

您已经说过“ ...在纹理中进行双线性过滤...”。似乎您正在插值阴影贴图的深度值。将插值与阴影贴图配合使用的正确方法是将其应用于阴影测试的结果(据我所记得,OpenGL支持这一点)。您甚至可以将阴影测试结果的插值与PCF结合使用,这将提供更好的结果。但是,您可能已经注意到,别名总是困扰着阴影映射的问题:)

尽管我知道您正在寻找有关阴影映射的解决方案(即使因为实现起来非常简单),但您是否考虑过使用阴影卷?它的实现要复杂得多,但完全不会出现混淆现象,我认为很适合您的目的。


非常感谢您的回答!为了获得我想要的结果,切换到影子卷可能是合适的。“插值”下提供的代码流链接非常有用-谢谢!
Daniel M Gessel '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.