可扩展环境遮挡渲染问题

Scalable Ambient Obscurance rendering issue

我正在尝试实施 this SAO algorithm

我得到以下结果:


我不明白为什么我的鼻子在墙顶上,这似乎是一个 z-buffer 问题。

这是我的输入值:

const float projScale = 100.0;
const float radius = 0.9;
const float bias = 0.0005;
const float intensityDivR6 = pow(radius, 6);

我使用的是未经修改的原始着色器,只是我禁用了深度缓冲区的 mipmap。

我的深度缓冲区(在不同的场景中,抱歉):


这应该是 zbuffer 线性化的问题,或者它不在 -1 和 1 之间。

谢谢布鲁诺,我终于弄清楚问题出在哪里了。 第一个是我没有正确转换我的 Z,他们使用特定的预通道使 Z 线性化并将其置于 -1 和 1 之间。我使用了不兼容的方法来做到这一点。

我还必须直接在投影矩阵中否定我的近平面和远平面值才能正确计算一些制服。

结果:

我有一个类似的问题,有视觉错误的遮挡,链接到 near/far,所以我决定告诉你我已经做了什么来修复它。

之前的评论中描述了我遇到的问题。当相机靠近物体或半径真的太大时,我会出现自我遮挡。

如果您仔细查看从深度缓冲区值到相机-space 值的转换(g3d engine 中的 reconstructCSZ 函数),您会发现将如果您使用正数 near/far,深度为 0 将为您提供近平面。所以,这意味着每次你在模型外点击时,你都会得到一个等于 near 的 z 分量,这会给你错误的遮挡 z 接近 0 的片段。 您基本上必须丢弃位于近平面上的每个抽头,以避免在计算全部贡献时将它们考虑在内。