如何防止远距离SSAO过多

问题描述

我几乎按照 John Chapman 的教程 here 使用 SSAO,事实上,使用 Sascha Willems Vulkan 示例。 一个区别是片段位置与线性深度一起直接保存到 G-Buffer(所以有 x、y、z 和 w 坐标,w 是线性深度,在 G-Buffer 着色器中计算。深度计算如下这个:

Microsoft.Web/sites/config

我的场景通常由一个大而平坦的地板组成,中间有一个模型。大我的意思是比远剪辑距离大得多。

在高深度值(即在我的示例中位于地平线处)时,SSAO 会在真正应该没有遮挡的地方生成遮挡 - 除了完全平坦的表面之外,什么也没有。 伴随着遮挡,还有一些条带。

关于如何防止这些遮挡发生的任何想法?

解决方法

我在写问题的时候找到了这个解决方案,这只是因为我有一个平坦的地板。

我在每个内核样本位置查找法线值,并与当前法线进行比较,丢弃任何点积接近 1 的值。这意味着平面不能自遮挡。

任何关于为什么我不应该这样做的评论,或更好的替代方案,将非常受欢迎! 它适用于我目前的情况,但如果我碰巧在地板上有非平面几何图形,我会寻找不同的解决方案。

float linearDepth(float depth)
{   
    return (2.0f * ubo.nearPlane * ubo.farPlane) / (ubo.farPlane + ubo.nearPlane - depth * (ubo.farPlane - ubo.nearPlane)); 
}