问题描述
写过一篇关于 SSAO 的文章的每一篇教程都以“准确地产生真实的结果”结尾。我们可以使用 shadow mapping 获得更准确的阴影,而无需额外的内存来存储充满随机向量的纹理[或统一数组] 用于采样或额外的模糊通道以减少条带,那么为什么还要使用 SSAO?>
我还看过一些结合 SSAO 和阴影映射的教程,这对我来说似乎有点矫枉过正。这两种技术都是用来产生阴影的吧?
解决方法
阴影映射和屏幕空间环境光遮蔽解决了渲染方程的不同部分,因为它们做出了不同的假设。
顾名思义,Screen-Space Ambient Occlusion 假设光线从我们采样的半球上方的每个可能方向均等地射出指向那个点。也就是说,为了解决环境遮挡问题,我们需要在采样点的半球上积分一个常数函数(辐照度)来确定半球的立体角中遮挡与环境的比例光源。
而且在 Screen-Space Ambient Occlusion 一词中,还有短语“Screen-Space”。这意味着,我们为了计算被均匀环境光源遮挡的采样点半球的分数而进行的计算仅基于我们在屏幕空间(而不是世界空间)中准备好的信息,例如场景几何体的分析光线投射/跟踪 - 我们可以这样做,但它不会再被称为屏幕空间环境光遮挡)。
因此,环境光遮蔽(屏幕空间环境光遮蔽是一种基于我们渲染到屏幕空间的信息来近似它的方法):
- 假设光线从采样点的半球上所有方向均等地照射
- 近似遮挡因子(采样点半球上没有来自环境光源的入射光的立体角分数)
另一方面:阴影贴图。这是一种对入射到我们采样点的辐照度做出完全不同假设的技术。在这里,我们不假设光从采样点半球上方的所有方向均等地发出,而是假设光来自单一方向(或当我们近似柔和阴影).
为了解决那个,我们可以从光线方向对场景进行采样,然后测试我们的采样点是否可以接收到来自该光线方向的光线。
,它们解决不同的问题并相互补充。
SSAO 解决 ambient occlusion。即使您的点在阴影中,SSAO 也会修改强度,以便更多被遮挡的区域更暗。阴影贴图不是那么准确。
这是一张对比图。整个区域都在阴影中,但使用 SSAO 可以更好地看到窗帘的形状(单击它可以将其打开更大,使其更明显):
Shadow maps 解决了光源的可见性,不考虑光弹跳(SSAO 使用深度缓冲区伪造了这一点)。
仅使用阴影贴图渲染的场景看起来比使用 SSAO 和阴影贴图的场景更平坦。