引言
原神是一款极具争议的产品,而争议的重点集中在商业模式上的骗氪和抠门,以及米哈游宣传的研发投入在实际效果上不能达到玩家期待。原神号称研发投入一亿美刀,至于它的技术是否真值这个价,本文将从分析原神的图形技术入手讨论这个问题,也算是有前车之鉴。
本文以PC版原神的最高画质为基准,共分为3大部分,第一部分简单讲解原神渲染一帧的流程,第二部分对一些关键的步骤和特效进行展开解说,第三部分着重分析原神在移动端上优化较差的原因。
1. 原神的渲染流程
经过揣摩原神渲染管线,得出的流程图大致如下:
<img src="data:image/svg+xml;utf8,” data-rawwidth=”1123″ data-rawheight=”1587″ data-size=”normal” data-caption=”” width=”1123″ data-original=”https://pic2.zhimg.com/v2-808567a7b27814045e49fd970d50da05_r.jpg” data-actualsrc=”https://pic2.zhimg.com/v2-808567a7b27814045e49fd970d50da05_b.jpg”>
图中的流程与实际的渲染管线可能有一定的出入,请以实际为准。
原神的渲染管线是一个以延迟渲染为主的,混合了前向渲染的大地图渲染管线,其延迟渲染的部分非常的常规,没有什么特别的地方。3A游戏中常见的Hi-Z Culling,SSR,Temporal AA,Cluster Lighting都全部具备。
必须要强调的是,现在很多人将美工技术和程序技术对画面表现的贡献混为一谈,这是不合理的,抛开制作组美术能力对画面表现的浮动,原神的渲染管线,单从程序技术上讲大致等同于欧美大型游戏在2015年左右的水平。
2. 原神的关键步骤和特效
2.1 原神的场景渲染
原神的场景渲染使用了非常的常规的PBS流程,绝大部分场景模型走在了延迟渲染的路径上。场景使用了Hi-Z进行GPU剔除,有着非常夸张的视距,站在庆云顶上隐约能看见公里外的蒙德城。
<img src="data:image/svg+xml;utf8,” data-rawwidth=”318″ data-rawheight=”200″ data-size=”normal” data-caption=”” width=”318″ data-actualsrc=”https://pic3.zhimg.com/v2-f07d61ffeb852689fe268836027ed50e_b.jpg”>
在建筑和一些地形上,原神使用了视差贴图来获得更立体的观感。
<img src="data:image/svg+xml;utf8,” data-rawwidth=”271″ data-rawheight=”192″ data-size=”normal” data-caption=”” width=”271″ data-actualsrc=”https://pic2.zhimg.com/v2-b71f44f212327b198ea387eba2c77631_b.jpg”>
<img src="data:image/svg+xml;utf8,” data-rawwidth=”298″ data-rawheight=”191″ data-size=”normal” data-caption=”” width=”298″ data-actualsrc=”https://pic3.zhimg.com/v2-ebd5708d4dfc13b3660a6fefa01325b6_b.jpg”>
原神使用了类似最后生还者在PS3上使用的椭球体方向遮蔽,实现了角色的间接阴影,相对于常规的SSAO而言,这种方法能够在侧视角上取得更好的效果。
<img src="data:image/svg+xml;utf8,” data-rawwidth=”291″ data-rawheight=”312″ data-size=”normal” data-caption=”” width=”291″ data-actualsrc=”https://pic2.zhimg.com/v2-344409672ec0a85bca0a373553992179_b.jpg”>
<img src="data:image/svg+xml;utf8,” data-rawwidth=”313″ data-rawheight=”251″ data-size=”normal” data-caption=”” width=”313″ data-actualsrc=”https://pic2.zhimg.com/v2-1dda9e9d724fef97ca2071c6086a3c7d_b.jpg”>
原神的地面云影是一种类似贴花的做法,可以很容易的发现地面的云影与天上的云片是对不上的。
<img src="data:image/svg+xml;utf8,” data-rawwidth=”504″ data-rawheight=”277″ data-size=”normal” data-caption=”” width=”504″ data-original=”https://pic1.zhimg.com/v2-d50e3b3a9682ae42f7bd579428302b6c_r.jpg” data-actualsrc=”https://pic1.zhimg.com/v2-d50e3b3a9682ae42f7bd579428302b6c_b.jpg”>
原神的反射大致有两种情况,第一种是针对建筑等实体场景的SSR与Cubemap混合的方法。其中SSR读取上一帧的渲染结果作为被反射的对象,以此达到一种光线多次反弹的效果。Cubemap似乎不是每一帧都会更新的,而是与角色的位置变化有关,在蒙德城教堂可以很明显的看出SSR切换到Cubemap的过程。
<img src="data:image/svg+xml;utf8,” data-rawwidth=”424″ data-rawheight=”221″ data-size=”normal” data-caption=”” width=”424″ data-original=”https://pic2.zhimg.com/v2-3684878c3ff75d3a911f11b24ff48139_r.jpg” data-actualsrc=”https://pic2.zhimg.com/v2-3684878c3ff75d3a911f11b24ff48139_b.jpg”>
<img src="data:image/svg+xml;utf8,” data-rawwidth=”317″ data-rawheight=”266″ data-size=”normal” data-caption=”” width=”317″ data-actualsrc=”https://pic3.zhimg.com/v2-6c616da4da3d525a529a81051f68712e_b.jpg”>
原神的水面使用了一种平面SSR,但是在物体和水面的交界处理的不好,有明显的渲染错误。
<img src="data:image/svg+xml;utf8,” data-rawwidth=”438″ data-rawheight=”231″ data-size=”normal” data-caption=”” width=”438″ data-original=”https://pic4.zhimg.com/v2-0f525b97e5a72e91c5d16b99877d2467_r.jpg” data-actualsrc=”https://pic4.zhimg.com/v2-0f525b97e5a72e91c5d16b99877d2467_b.jpg”>
除此之外,还使用了基于球谐的天空光照 ,与SSR混合后实现了某种程度上的GI效果。
2.2 原神的角色渲染
原神的角色渲染直接使用前向渲染将角色的最终着色渲染到G-Buffer中的Diffuse中,也就是说角色的光照都是在LDR下计算的,角色的光照算法也与崩坏3几乎相同,这一点就不用再重复,各路友商对崩坏3的分析已经非常透彻了。
角色受环境光照的影响是通过读取上一帧 的Ambient Sensor纹理计算的。由于某些原因并没有对角色受光做插值,导致角色在阴影边缘时会有光照的跳变,在角色高速移动时有肉眼可见的延迟。
<img src="data:image/svg+xml;utf8,” data-rawwidth=”540″ data-rawheight=”292″ data-size=”normal” data-caption=”” width=”540″ data-original=”https://pic2.zhimg.com/v2-e0ed666311e2377f5bc22af4dfbe3769_r.jpg” data-actualsrc=”https://pic2.zhimg.com/v2-e0ed666311e2377f5bc22af4dfbe3769_b.jpg”>
<img src="data:image/svg+xml;utf8,” data-rawwidth=”521″ data-rawheight=”316″ data-size=”normal” data-caption=”” width=”521″ data-original=”https://pic3.zhimg.com/v2-3806f16a5e76e0189bf91a28fd7fae5a_r.jpg” data-actualsrc=”https://pic3.zhimg.com/v2-3806f16a5e76e0189bf91a28fd7fae5a_b.jpg”>
2.3 原神的特效渲染
PC版的原神在特效上没有什么值得大书特书的地方。值得提起的是移动端的原神在特效上使用了半分辨率优化,透明粒子在半分辨率上计算,很大程度上降低了Alpha Blending的开销。
<img src="data:image/svg+xml;utf8,” data-rawwidth=”442″ data-rawheight=”263″ data-size=”normal” data-caption=”” width=”442″ data-original=”https://pic1.zhimg.com/v2-f29efa8c437174f3d4f6da846e87cec8_r.jpg” data-actualsrc=”https://pic1.zhimg.com/v2-f29efa8c437174f3d4f6da846e87cec8_b.jpg”>
除此之外原神的云雾和某些角度的光线使用了Ray Marching来实现体积效果,并不是单纯的贴片。
<img src="data:image/svg+xml;utf8,” data-rawwidth=”308″ data-rawheight=”210″ data-size=”normal” data-caption=”” width=”308″ data-actualsrc=”https://pic3.zhimg.com/v2-182f5b80e789f171d73b5636a8b644de_b.jpg”>
<img src="data:image/svg+xml;utf8,” data-rawwidth=”312″ data-rawheight=”211″ data-size=”normal” data-caption=”” width=”312″ data-actualsrc=”https://pic2.zhimg.com/v2-96d98c348f5593d1661d7b8aa58adf79_b.jpg”>
3. 原神的移动端优化
原神出于优化的考虑,绝大多数安卓设备运行原神的3D分辨率长边不超过1280像素,导致画面非常模拟,使用TAA也无济于事。而原神在移动端上对透明物体进行的半分辨率渲染,在部分机型上半透明RT宽边甚至只有288像素。
在大量使用了降分辨率渲染,删除了大量屏幕空间特效后,原神的性能表现仍然非常差,没有任何一款移动端SoC可以长时间稳定以60FPS运行原神。原神移动端优化差的原因大概有以下几点:
- 延迟渲染直接用MRT硬画,而没有使用Frame Buffer Fetch或者SubPass。
- G-Buffer不节约,带宽开销过大。直接存储计算后的diffuse和specular,normal也没有做压缩,浪费了至少32bit的带宽。
- 岩石,植被等游戏性无关的地形附件渲染视距过大,LoD过于保守,即使使用了GPU Culling仍然DrawCall过多(上千次),同时有非常严重的quad overdraw。
- 降分辨渲染后上采样有额外的性能开销,在TBR和TBDR的GPU上可能导致反向优化。
作为结论,原神的渲染管线对于国内友商有一定的参考价值,但是也不是有那么参考价值。图形技术需要与产品的美术风格相匹配,是一种做减法的艺术。原神的PBS材质,超大视距渲染,在这样一个赛璐璐卡通的美术风格上是非常没有必要的。从这个角度而言原神的图形技术性价比很低,难以与其资金投入相匹配。
而友商如果参与到与原神竞争的军备竞赛中,可能也是一个“倒逼业界精品化”的过程。