作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近我正在研究我的 SSAO 实现,对于我的引擎,我想添加对前向和延迟渲染器的支持,因此我选择使用仅深度方法并从深度图重建法线,这是代码:
//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 实现上,它取得了相当不错的结果,除了边缘:
我确定那是因为边上的法线不连续,但我不知道如何解决它。那么在从深度重建法线时,有什么方法可以避免边缘上的伪影吗?谢谢。
最佳答案
除了生成法线 gbuffer 之外,没有办法完全消除所有伪影。但是有一种重建法线的解决方案可以为您提供更好的结果:
我在引擎中所做的是,我采用 5 个深度样本进行正常重建。它们的位置像十字架。中心样本是您当前正在渲染的像素,您对该中心样本上方、左侧、右侧和下方的像素进行采样。然后对于正常重建,您只需取最近的 Y 样本(中心样本上方或下方的样本)和相对于中心样本最近的 X 样本(中心样本的左侧或右侧)。这在 99% 的情况下消除了那些正常的人工制品,但它引入了分支并且需要更多的纹理样本。因此,它比只做您已经在做的事情要慢很多。
使用 SSAO 改进(交叉模式)正常重建: (请原谅我过时的 SSAO 截图)
另请注意,使用 dFdx()
和 dFdy()
可能总是会导致比仅对深度纹理采样三次更多的伪像(因为无法保证dFdx()
或 dFdy()
返回的值将是准确的),这在您的示例中很明显。
关于opengl - 如何在没有边缘伪影的情况下从深度重建法线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37627254/
我是一名优秀的程序员,十分优秀!