600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 聊聊引擎底层如何实现SSAO渲染

聊聊引擎底层如何实现SSAO渲染

时间:2023-02-14 22:30:26

相关推荐

聊聊引擎底层如何实现SSAO渲染

网上关于SSAO渲染介绍的很多,本篇博客也是将现有算法应用到我们自己研发的3D引擎中,SSAO被称为屏幕空间环境光遮蔽,它的原理是:对于铺屏四边形(Screen-filled Quad)上的每一个片段,我们都会根据周边深度值计算一个遮蔽因子(Occlusion Factor)。这个遮蔽因子之后会被用来减少或者抵消片段的环境光照分量。遮蔽因子是通过采集片段周围球型核心(Kernel)的多个深度样本,并和当前片段深度值对比而得到的。高于片段深度值样本的个数就是我们想要的遮蔽因子。

SSAO的整体流程示意图:

1、渲染场景中的物体到G-Buffer;

2、利用G-Buffer中的数据,通过TBN矩阵,将采样点从切线空间,变换到视图空间,并在这个空间比较并计算SSAO的值,并写入AmbientOcculction;

3、对AmbielntOcculction Texture进行模糊处理,去掉噪声;

4、利用AmbielntOcculction Texture 获得正确的环境光照遮蔽效果。

根据以上原理我们实现出SSAO的Shader脚本,实现的代码如下所示:

在第2步中,我们需要采样点,在Shader代码中,使用了for循环64次采样,我们的采样是在切线空间进行的,这也是为了统一处理,最后,计算采样实际位置,再将它们变换到视空间中。这样才能和存储在G-Buffer里面的深度信息进行比较。用采样点的深度值,去和屏幕空间的深度值去比较作为是否被遮挡判断依据。我们在Shader代码中实现了计算采样点深度值和采样点深度值的平滑插值。下面我们再看看在引擎中的C++代码实现如下所示:

引擎中的代码跟上篇博客中的Deferred延迟渲染类似,我们在引擎中实现的测试效果图如下所示:

在引擎中最终渲染效果如下图所示:

总结:

SSAO算法在网上很多人为此写过,但是都没有介绍如何在引擎实现,我们要将单个的知识点整合应用到引擎中,这样就可以实现一个渲染系统,积少成多,逐步完善就形成了一个渲染引擎。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。