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




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



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

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



我在纹理中启用了双线性过滤(如果没有,则会出现严重的阴影痤疮)。可悲的是,我对PCF的尝试也失败了-它看起来像衣衫agged的:



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



这看起来像“典型的”投射混叠吗?

编辑:添加双线性过滤的特写镜头,发布阴影比较,只是为了显示什么,可以使用裁剪后的视锥体剪切场景来动态渲染阴影贴图吗?知道了由于内部边缘,阴影暗疮出现。我正在使用堆叠的虚拟块进行建模,但未执行正确的合并操作。根据我的阅读,在多面体上执行布尔运算并非易事,但也将允许我实现静态阴影体积以及清理某些3D打印软件。



#1 楼

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


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

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


显然是PCF,但建议结合使用具有内置硬件PCF的PCF实现(在Opengl中-使用sampler2DShadow)。这样可以减少循环次数,降低PCF的成本,并且可以使用旋转的泊松圆盘将边缘的平整度交换为噪声。每次使用PCF循环时,都会从阴影贴图采样的样本随机旋转。

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


渲染阴影贴图应用于MSAA应用的帧缓冲区,
通过插值进一步增强PCF,
通过时间混合增加样本数量。

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

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




指数阴影贴图和方差阴影贴图-在大多数情况下,不会出现暗疮痤疮,并且边缘光滑无障碍,但会增加某些漏光的情况,
指数方差阴影贴图-可能是2D深度图阴影贴图的最先进技术,结合了VSM的极佳平滑度并解决了光泄漏,而内存使用量却增加了一倍,

百分比更接近的软阴影-增强具有不同半影大小的传统阴影贴图,

多视图阴影贴图-某些技术的多个阴影贴图,排列在面光下,用于计算具有不同半影大小的逼真的软阴影,

深阴影贴图-用于增强阴影的体积散射,
实时光线跟踪的阴影-可能是未来。

PCF并没有失败,它看起来像这样:)

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

评论


$ \ begingroup $
此评论的一部分感谢您的回答,所以我只是想让您知道,因为您不会从那里收到通知。
$ \ endgroup $
– trichoplax
16年12月20日在20:51

$ \ begingroup $
是的,我看到了,但是谢谢。
$ \ endgroup $
–narthex
16 Dec 20 '21:19

#2 楼

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

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

评论


$ \ begingroup $
非常感谢您的回答!为了获得我想要的结果,切换到影子卷可能是合适的。 “插值”下提供的代码流链接非常有用-谢谢!
$ \ endgroup $
–丹尼尔·格塞尔(Daniel M Gessel)
16 Dec 17 '13:43