浅谈《Sky 光·遇》中的渲染技术

时间:2024-03-26 16:48:37

分析顺序根据个人喜好和出现顺序,有想法或不同见解尽管留言

苹果为什么给Thatgamecompany三分钟

首先,别管用什么引擎,移动平台的图形API一般用OpenGL;苹果之前就推出了Metal打算在自己设备上替代OpenGL;但是大部分开发者不愿意,两个商业引擎的支持也不到位;Thatgamecompany的自研引擎很好的接入了最新的Metal 2。
粗略的说原因就是开发sky光遇的引擎把苹果的自家图形API Metal 2用得很6,展现出了Metal 2的强大,呼吁开发者使用Metal 2作为图形接口,而不是OpenGL。(据我了解,Unity和Unreal对Metal的支持还停留在上个世纪的版本,截止2019/10/21)
你可以先读Apple’s Forced Move to Metal 2: Great for Game Developers?苹果抛弃 OpenGL !了解一下苹果的战略意图。
那么对比OpenGL,Metal 2优势在哪呢?
请去看视频 Introducing Metal 2

-------------------------正题------------------------------

云的渲染

常见的做法有这么几种:

  1. 3A常用的RayMarching体积云
  2. 上个世纪的片面云
  3. 纯Mesh云,或Mesh与片面结合 时空幻境作者作品The Witness有用到
  4. 最Low的软粒子云,PC都用不起

其中,RayMarching云有很多种做法:

  1. 云的形状来自于可平铺的3D Noise,地平线的做法,很省内存128^3的噪声纹理,一张天气图,一张高层云纹理。实现请去看 GPU Pro7 II 4,还原到可以使用的地步,亲测没那么容易, -_-||
  2. 云的形状来自于3D纹理,纹理中存储了云的形状,云的形状容易控制,实现也相对简单,但内存消耗高,当然这取决于云的种类数量
  3. 提前在Houdini里做好特定形状的云并渲染,直接导出体素信息再到引擎里,云的形状容易控制,但不支持动态光照

光遇中的体积云:
浅谈《Sky 光·遇》中的渲染技术
移动设备RayMarching几乎是不可能了,比较流行的说法是通过3D可平铺噪声对用多层Mesh顶点偏移,你的Mesh什么形状,云就大体什么形状。根据WalkingFat老哥的测试,干掉深度Pass的情况下,中端安卓30FPS+。(但是,你的游戏里又不是只有云,虽说这游戏云占了大半屏,光遇的UI这么简单,一个是游戏风格因素,另外我觉得机能全用到云,草,任务,粒子效果上了。。)
WalkingFat已经在他的博客讲解了他的做法,这里就不赘述了。
浅谈《Sky 光·遇》中的渲染技术

草地的渲染

因为自带的地形,没有对草合批,根本没法用,所以
大面积草地常用的做法:

  1. 利用GPU instancing绘制,提前计算好坐标,或者在文件中读取,用DrawMesh等函数一批最多绘制1023个实例,传人物坐标到Shader,扰动在Shader里做。具体做法,我以前写过,也可以从Git上下载源码做参考GrassSkyLight,很早之前写的,不好看,代码诟病很多,凑活看吧。
  2. 曲面细分,这个做法确实骚,但是移动端不太敢想。具体做法已经有老哥分享了,不再赘述。

光遇中的草地:
浅谈《Sky 光·遇》中的渲染技术
众所周知,旷野之息中的草分为近草中草远草,根据距离划分层次节省性能;
光遇似乎没有这样做,但也在你不容易注意到的地方省了十几或几十个批次,比如下图中高地上的草只是沿着UV方向流动的贴图。这种地方很多,把机能投放在了玩家更能注意到的地方。
浅谈《Sky 光·遇》中的渲染技术
这里我只能大概猜测它的做法:广告牌,Gpu Instancing,流动纹理。草和花的HDR强度似乎也会根据流动的贴图呼吸,或者根据时间。扰动的做法,同上,包括扰动变亮。

人物渲染

浅谈《Sky 光·遇》中的渲染技术
刚进入游戏,就看到了次表面散射,也就是于是玉石的效果。
关于次表面散射:
GPU Gems1 III 1 就详细讲解了实时次表面散射近似;
GPU Pro 1 III 7 也有屏幕空间的次表面散射;
网上博客多的一批,各种意义上的实现并不困难。
浅谈《Sky 光·遇》中的渲染技术
虽然图没截好,但我想说的是,人物的“斗篷”没有写入阴影,似乎是因为写入阴影会影响人物身体的视觉效果。非真实渲染管他阴影什么的,好看就行。
人物胸前像奥特曼呼吸灯一样那个东西,是HDR曝光,这么推测的原因是遮挡多一点就不怎了亮了。
人物升级还是什么的某种特殊状态的强菲涅尔,没截到。
其他边缘光什么的就不提了。

后处理部分

  1. HDR开启,曝光启动。游戏中大部分发光都是这样做的。
  2. 经常看到的太阳十字光晕,应该是屏幕空间的效果,因为经常能把人物盖住,像准星一样。
    浅谈《Sky 光·遇》中的渲染技术
  3. 抗锯齿部分。这个游戏抗锯齿很到位,个人肿脸推测可能是TAA,自从Inside之后就很流行,性价比高。简单来说就是保留上一帧的VP矩阵,Pos * ViewProj^-1 * VP,变换到上一帧的裁剪空间里,对上一帧采样,以达到升采样的目的,可多帧,TAA对体积云很受用。具体去看Inside的PPT分享,也不排除MSAA * 4
  4. 目前就看到这些

关于优化

浅谈《Sky 光·遇》中的渲染技术

  1. 上图中,鸟数量很大,但仔细观察,除了坤,都是双面渲染的面片。Gpu Instancing就特别适合这种数量多,面数少的。这鸟也没阴影,整个鸟群可能一个批次就完事了。
  2. 不存在摄像机深度。这个游戏的似乎没有用到摄像机深度图,经常出现的那个扩散球的的效果,没有对球与地面接触的地方额外画线,也没有景深什么的。省了省了
  3. 因为是移动平台,场景中灯的数量也比较少,所以前向渲染。

其他部分

这个游戏的水做的一般,截止到2019/10/21这个版本,如果仔细看,可以看出流动贴图的不协调感。

就玩到坤那里,我感觉画面挺好,就是玩着没意思,未完待续