目前,我的引擎中有基本的阴影映射设置。我目前正在尝试实现更逼真的效果,例如PCSS(百分比更接近的柔和阴影),以获取更准确的物理效果,如下图所示。 (看看阴影如何变得越来越柔和吗?)



我的两个问题是:

1)是否值得实现像这样的阴影映射技术?人们真的会注意到其中的区别吗?

2)如果值得,我可以从哪些资源中学到更多知识? PCSS等主要技术有哪些?

评论

您的用例是什么?您在玩游戏吗?电影般逼真的渲染? CAD?这对人们是否会注意到有很大的不同。

这是针对游戏的,但是人们是否仍会在CAD可视化或Cinema Rendering中注意到它?

当然,在电影院渲染中,它会引人注目,尤其是当它与实景镜头混合时。对于CAD,可能希望将显示的结果显示给例如建筑客户,但我认为这样做可能不是必需的。我玩过的大多数游戏都没有最大的阴影。我通常会注意到,但不知道一个普通人会得到多少。无论如何,我只是想弄清楚用例,因为它可以在您是否需要实时以及您愿意做出的质量与时间的权衡之间有所不同。

“这值得么?”完全取决于您的用例。您可以(并且应该)查看在具有与您相似的用例和约束集的产品中所完成的工作,但最后只有您可以做出决定。

#1 楼

对于具有较大立体角的光源,并且阴影投射器比接收器相对更靠近光源,您会获得显着的柔和阴影效果。因此,如果您将较大的光源渲染到更靠近阴影接收器的位置,则必须正确处理柔和阴影以实现逼真的照明,这一点很重要。即使太阳的立体角很小,您仍然可以从高层建筑物中看到相当大的半影。

PCSS是实现接触硬化阴影的相当简单的算法,但是它存在一些值得注意的问题。当软阴影和硬阴影相交时,PCSS会失败(阻止搜索失败),因此,当需要大半影时,这不是一个好的算法。在下图中看到框和三角形的阴影相交的地方。当制作动画时,此伪像尤其令人不安。



虽然有一系列“反投影”阴影技术,但它们能够处理更大的半影。但是,对于我知道的实时应用程序,如何有效地实现这一点尚有一些研究。



在反投影中,原理是将阴影贴图像素映射到光源以计算每个像素,以计算光遮挡,这在天真地实现时显然非常慢,而且会引入阴影间隙和重叠。但是,有一些技术可以避免这些伪像,例如如下所示调整微四度范围。



处理间隙和重叠的另一个改进是:使用位遮罩软阴影算法,其中遮挡位遮罩确定光源的遮挡区域。

我在该主题上看到的最新论文是Sam Martin在2012年撰写的“实时区域照明。现在和下一次”,其中单个灯的成本为几毫秒,但是如果您对此感兴趣的话,绝对值得一读。主题,以获取有关最新的实时阴影技术的一般想法。

#2 楼

PCSS的性能有限,主要是因为阴影图的大小和为了获得可接受的结果而必须采取的采样器数量,因此PCSS作为一种实时阴影技术似乎没有那么吸引人。无论如何,我还是建议您实施它,因为其他阴影生成算法使用了相同的技术,并且该文件已被很好地记录在案,因此很容易找到可以帮助您解决问题的信息。另外,在很多情况下,PCSS都“足够好”,因此您可以将精力花在应用程序的其他方面。特别是考虑到任何给定游戏都能运行的广泛硬件。带有PCSS的高端计算机可能不是“资源的最佳利用”,但是它肯定会给渲染带来额外的负担。
此外,一旦实现,将其迁移到诸如VSSM的另一种算法并不难。 (方差软阴影贴图),它需要32位缓冲区,但允许使用较小的阴影贴图。但是VSSM也没有记录,因此从头开始编写变得更加困难。英伟达(Nvidia)在该主题上有一篇不错的论文:链接至Nvidia VSSM Paper。他们还有一个带有代码的应用程序,因此您可以并排比较这两种算法。
《实时阴影》一书是阴影映射的很好参考。而且通常可以以合理的价格使用。