2

我正在尝试实现这个 SAO 算法

我得到以下结果:

结果

我不知道为什么我的鼻子在墙上,这似乎是一个 z 缓冲区问题。

这是我的输入值:

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

除了禁用深度缓冲区的 mipmap 之外,我使用的是原始着色器而不进行任何修改。

我的深度缓冲区(在不同的场景,对不起):

深度

4

3 回答 3

2

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

于 2016-05-19T20:00:41.283 回答
1

谢谢布鲁诺,我终于弄清楚了问题所在。首先是我没有正确地转换我的 Z,他们使用特定的预通使 Z 成为线性并将其置于 -1 和 1 之间。我使用了一种不兼容的方法来做到这一点。

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

结果 : 结果

于 2016-05-19T22:15:26.357 回答
0

我有一个类似的问题,有视觉错误的遮挡,与近/远有关,所以我决定给你我所做的修复它。

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

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

于 2016-12-22T15:05:43.987 回答