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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jxw167/article/details/85054688

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

猜你喜欢

转载自blog.csdn.net/jxw167/article/details/85054688