文章

Unity实现SSGI终章

Unity实现SSGI终章

​ ​ 继续折腾了几天SSGI的实现方法,把流程改成如下形式:

image-20260728033211103.png

​ ​ 改完之后的流程,增加了一个 Forward GBuffer Pass,顾名思义,就是用来输出GBuffer的。Forward Lit Pass就是正常的物体渲染流程,这里我们只计算直接光,同时获得深度图。

​ ​ Forward GBuffer PassForward Lit Pass输出的结果,都在 SSGI Pass中使用,用来计算当前帧反射n根光线得到的 Irradiance Map,这会产生很多噪点。但经过多帧累积求和,就可以得到收敛的结果,具体的实现原理可以参考我上一篇文章中介绍的基本方法,只是不再在渲染物体时把每帧累加的 Irradiance用来进行表面着色,而是在后处理阶段,通过一个 Combine Pass,将直接光照的结果和间接光照的结果加在一起,得到最终的结果。在加上TAA降噪,就可以得到如下图看起来比较干净的结果了。

image-20260728033320354.png

​ ​ 如下图,第一张图是Sponza直接光照的结果,第二张图是加上 SSGI的结果,而且是简单计算了PBR表面BRDF得到的结果。

image-20260729020954970.png

image-20260729021256545.png

​ ​ Render Feature的参数如下:

image-20260729021418078.png

​ ​ SSGI是一种利用屏幕空间信息来模拟光线追踪的实时GI的方法,因为是基于屏幕空间,所以会缺少被遮挡信息和离屏信息,当屏幕中物体发生变化频繁时,效果会下降很多,但由于它比较廉价,所以也可以获得还算不错的效果,不过在实际落地时,会非常依赖时域方法来避免因为场景变化导致的噪点和重新积分,其他优秀的实现暂时没有研究太多,就先到这里吧。

​ ​ SSGI的研学就先告一段落了。下一步开始光照探针,DDGI等相关资料的整理和总结,目标实现一个离线的烘焙器,把基于VTCode的八叉树用起来。

Github链接

链接地址

许可协议:  CC BY 4.0