首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在没有边缘伪影的情况下从深度重建法线?

如何在没有边缘伪影的情况下从深度重建法线?
EN

Stack Overflow用户
提问于 2016-06-04 14:44:07
回答 1查看 3.7K关注 0票数 3

最近我正在做我的SSAO实现,对于我的引擎,我想添加对前向和延迟渲染器的支持,因此我选择使用仅深度方法并从深度图重建法线,以下是代码:

代码语言:javascript
复制
//Restore view space position with non-linear depth
vec3 viewPos = getPosition(uv, depth, invProjMat);
//Restore view space normal
vec3 normal = normalize(cross(dFdx(viewPos), dFdy(viewPos)));

然后我将这个法线应用到我的SSAO实现中,它基本上达到了相当好的结果,除了边缘:

我确信这是因为边缘的不连续法线,但我不知道如何修复它。那么,当从深度重建法线时,有没有什么方法可以避免边缘上的伪影?谢谢。

EN

回答 1

Stack Overflow用户

发布于 2017-02-20 19:13:47

除了生成一个法线gbuffer之外,没有办法完全消除所有的伪像。但是有一个重建法线的解决方案可以让你得到更好的结果:

我在我的引擎中做的是,我取5个深度样本进行正常重建。它们的位置就像一个十字架。中心样本是您当前正在渲染的像素,您可以对该中心样本上方、左侧、右侧和下方的像素进行采样。然后,对于法线重建,只需获取最接近的Y样本(在中心样本的上方或下方)和最接近的X样本(中心样本的左侧或右侧)相对于中心样本。这在99%的情况下消除了那些正常的伪影,但它引入了分支,并且需要更多的纹理样本。因此,它比仅仅做你已经在做的事情要慢得多。

经典法线重建:

改进的(交叉模式)法线重建:

使用SSAO进行经典法线重建:

使用SSAO改进的(交叉模式)正常重建:

(请原谅我的SSAO截图过时)

还请注意,使用dFdx()dFdy()可能会产生更多的瑕疵,而不仅仅是对深度纹理采样三次(因为不能保证dFdx()dFdy()返回的值将是准确的),这显然就是您示例中的情况。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37627254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档