可扩展的环境不一致渲染问题

时间:2016-05-18 10:10:47

标签: opengl ssao

我正在尝试实施this SAO algorithm

我得到以下结果:

result

我无法弄清楚为什么我的鼻子在墙顶,这似乎是一个z缓冲问题。

以下是我的输入值:

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

我正在使用原始着色器而没有修改,除了我禁用深度缓冲区的mipmap使用。

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

depth

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

谢谢布鲁诺,我终于找出了问题所在。 第一个是我没有正确地转换我的Z,他们使用特定的预先通过使Z线性并将其置于-1和1之间。我使用了一种不兼容的方法来做它。

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

结果: result

答案 2 :(得分:0)

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

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

如果仔细查看从深度缓冲区值到相机空间值(g3d engine中的reconstructCSZ函数)的转换,您会看到将深度替换为0将为您提供如果你在近/远处工作,那就近在咫尺。所以,这意味着每次你在模型外面得到一个水龙头时,你会得到一个等于近的z分量,这会给你一个z接近0的片段的错误遮挡。 您基本上必须丢弃位于近平面上的每个水龙头,以避免在计算完全贡献时将其考虑在内。