[siggraph19]《荒野大镖客2》的大气云雾技术(2/3)

[siggraph19]《荒野大镖客2》的大气云雾技术(2/3)

研发的本原的样子

接下来我们看第二部分,这部分主要谈渲染部分,包括scattering 和lighting的render,相对内容也多一些。
可以说这部分是本片重点所在,笔记部分基本上是大家看了原文之后大致能记住的部分,实际上原文涵盖的内容要更多更杂,然后这背后还有更多的探索和尝试,因为篇幅的原因没有写出来。
读的时候完全没法像一些论文,尤其是少项目而重理论和demo向的,可以简单的做抽象和总结,可以“一句话说清楚”。
实际像《荒野大镖客2》这样的项目,这个就是研发中所面临的问题,理论惨杂着妥协与变通(hack),并且要覆盖极高的复杂度。
实际做的时候,宏观的视野?是的;扎实的理论?是的;扎实的engineering?是的;充分的耐心?是的;灵活的变通?是的;

像我个人之前做《天涯明月刀》《无限法则》相关的技术分享,ppt写的时候往往写的“重点突出”,“易听易懂”甚至还带着两个笑话;
而实际上,做项目开发中,就是一个复杂度高的多,繁杂的多的过程,但是那么来写ppt,往往观众会听得云里雾里,所以最终的结果还是“一句话说清楚”。
《荒野大镖客2》,分享者也足够耐心,列了方方面面,包括raymarching中优化的几个失败案例,确实更像研发原本的样子。

voxel+raymarching

[siggraph19]《荒野大镖客2》的大气云雾技术(2/3)
处理大气效果时候,为了兼顾近处的精度和场景的宏大,使用了混合方案:

  • 近处使用voxelization的方式,得到高精度的渲染结果,这个一定程度上是基于
  • 远处使用rayMarching的方式,平衡效果和效率

近处voxelization部分,reference了刺客信条的大气的部分:
https://blog.****.net/toughbro/article/details/46706837

光照模型

[siggraph19]《荒野大镖客2》的大气云雾技术(2/3)
这里最终的光照模型,使用这样的公式列出来,这个比较像大家所熟悉的PhysicallyBasedLighting中的macrofacet公式的模样,其中三项如下:

  • P:phase的缩写,是光通过media时候的scattering的情况
  • V:visibility,我们可以近似理解成shadow类的东西
  • L:lighting,也就是光源,直接光,ambient lighting等等

phase项

[siggraph19]《荒野大镖客2》的大气云雾技术(2/3)
这里分成两个层级:

  1. 基础phase模型,是基于Henyey-Greenstein phase function(简称HG),这个模型对于single forward scattering处理的比较好
  2. 多种scattering组合,基于上面的擅长处理single forward scattering的HG(heney-greenstein)模型,
  3. ==使用多级HG模型来模拟multi scattering
  4. ==使用一个clamp操作来模拟back scattering
    这里稍微贴下HG模型的样子,
    [siggraph19]《荒野大镖客2》的大气云雾技术(2/3)
    这里g项是[-1,1]之间,代表从back scattering到forward scattering的情况,表示media的属性
    theta就是各个角度,phase function就是关于角度的函数么。

HG函数这部分还是比较物理的,但是multi scattering部分就是比较变通了,是多级HG来模拟multi scattering,各级之间的权重由美术定义。

然后给定g,关于theta就可以预计算出来,放到LUT(look up tabble)贴图中:
[siggraph19]《荒野大镖客2》的大气云雾技术(2/3)
最后放在一起的效果:
只有一级HG function的时候:
[siggraph19]《荒野大镖客2》的大气云雾技术(2/3)
2级HG function模拟multi scattering+back scattering:
[siggraph19]《荒野大镖客2》的大气云雾技术(2/3)

”physically based"的度和变通

这里也是涉及到一个“physically based"的程度问题,原则上我们是要physically based这样会尽可能的物理化,好处现在PBR已经论证的非常好了。
但是实际开发中,我们会遇到各种需要折中的地方,或许是物理模型不够好,或许计算过重等等;
这时候,none-physically-based就还是需要了,这时候建议是,尽可能在高层去做hack和变通,保持底层原子项部分的“physically based"正如phase function这里,底层是HG function,高层是美术来指定的函数。

visibility项

[siggraph19]《荒野大镖客2》的大气云雾技术(2/3)
这一项就是光照信息中间被遮挡的情况,和直接光照有点不一样的是,由于这个是一个scattering的过程,所以完整来讲是光线一路射过来中间每一步的visibility情况的叠加。
[siggraph19]《荒野大镖客2》的大气云雾技术(2/3)
落实到实际计算中,就是ray marching中间每一步的visibility情况的叠加。
这里visibility主要针对影响大的两个case:terrain, cloud来做计算。
terrain使用raymarching的方式构建一个shadowmap信息;
cloud使用exponential shadow map的方式,来encode shadow map信息,来达到非常软阴影的信息,一共存了6mips(esm的使用在刺客信条的文章里也有)

lighting项

[siggraph19]《荒野大镖客2》的大气云雾技术(2/3)
ambient lighting部分:

  • 远处的ray marching部分,就是sky ambient,把sky scattering存到低精度的paraboloid贴图里面
  • 近处的frustum voxelization部分,sky light+light probe lighting*AO
    [siggraph19]《荒野大镖客2》的大气云雾技术(2/3)local light 部分,直接就读light cluster volume.