[siggraph19]《荒野大镖客2》的大气云雾技术(2/3)
研发的本原的样子
接下来我们看第二部分,这部分主要谈渲染部分,包括scattering 和lighting的render,相对内容也多一些。
可以说这部分是本片重点所在,笔记部分基本上是大家看了原文之后大致能记住的部分,实际上原文涵盖的内容要更多更杂,然后这背后还有更多的探索和尝试,因为篇幅的原因没有写出来。
读的时候完全没法像一些论文,尤其是少项目而重理论和demo向的,可以简单的做抽象和总结,可以“一句话说清楚”。
实际像《荒野大镖客2》这样的项目,这个就是研发中所面临的问题,理论惨杂着妥协与变通(hack),并且要覆盖极高的复杂度。
实际做的时候,宏观的视野?是的;扎实的理论?是的;扎实的engineering?是的;充分的耐心?是的;灵活的变通?是的;
像我个人之前做《天涯明月刀》《无限法则》相关的技术分享,ppt写的时候往往写的“重点突出”,“易听易懂”甚至还带着两个笑话;
而实际上,做项目开发中,就是一个复杂度高的多,繁杂的多的过程,但是那么来写ppt,往往观众会听得云里雾里,所以最终的结果还是“一句话说清楚”。
《荒野大镖客2》,分享者也足够耐心,列了方方面面,包括raymarching中优化的几个失败案例,确实更像研发原本的样子。
voxel+raymarching
处理大气效果时候,为了兼顾近处的精度和场景的宏大,使用了混合方案:
- 近处使用voxelization的方式,得到高精度的渲染结果,这个一定程度上是基于
- 远处使用rayMarching的方式,平衡效果和效率
近处voxelization部分,reference了刺客信条的大气的部分:
https://blog.****.net/toughbro/article/details/46706837
光照模型
这里最终的光照模型,使用这样的公式列出来,这个比较像大家所熟悉的PhysicallyBasedLighting中的macrofacet公式的模样,其中三项如下:
- P:phase的缩写,是光通过media时候的scattering的情况
- V:visibility,我们可以近似理解成shadow类的东西
- L:lighting,也就是光源,直接光,ambient lighting等等
phase项
这里分成两个层级:
- 基础phase模型,是基于Henyey-Greenstein phase function(简称HG),这个模型对于single forward scattering处理的比较好
- 多种scattering组合,基于上面的擅长处理single forward scattering的HG(heney-greenstein)模型,
- ==使用多级HG模型来模拟multi scattering
- ==使用一个clamp操作来模拟back scattering
这里稍微贴下HG模型的样子,
这里g项是[-1,1]之间,代表从back scattering到forward scattering的情况,表示media的属性
theta就是各个角度,phase function就是关于角度的函数么。
HG函数这部分还是比较物理的,但是multi scattering部分就是比较变通了,是多级HG来模拟multi scattering,各级之间的权重由美术定义。
然后给定g,关于theta就可以预计算出来,放到LUT(look up tabble)贴图中:
最后放在一起的效果:
只有一级HG function的时候:
2级HG function模拟multi scattering+back scattering:
”physically based"的度和变通
这里也是涉及到一个“physically based"的程度问题,原则上我们是要physically based这样会尽可能的物理化,好处现在PBR已经论证的非常好了。
但是实际开发中,我们会遇到各种需要折中的地方,或许是物理模型不够好,或许计算过重等等;
这时候,none-physically-based就还是需要了,这时候建议是,尽可能在高层去做hack和变通,保持底层原子项部分的“physically based"正如phase function这里,底层是HG function,高层是美术来指定的函数。
visibility项
这一项就是光照信息中间被遮挡的情况,和直接光照有点不一样的是,由于这个是一个scattering的过程,所以完整来讲是光线一路射过来中间每一步的visibility情况的叠加。
落实到实际计算中,就是ray marching中间每一步的visibility情况的叠加。
这里visibility主要针对影响大的两个case:terrain, cloud来做计算。
terrain使用raymarching的方式构建一个shadowmap信息;
cloud使用exponential shadow map的方式,来encode shadow map信息,来达到非常软阴影的信息,一共存了6mips(esm的使用在刺客信条的文章里也有)
lighting项
ambient lighting部分:
- 远处的ray marching部分,就是sky ambient,把sky scattering存到低精度的paraboloid贴图里面
- 近处的frustum voxelization部分,sky light+light probe lighting*AO
local light 部分,直接就读light cluster volume.