本文从大面上介绍了下UE4移动端渲染的相关东西,实在是太大面了,里面每一条都可以展开说很久,大概也就是Base pass说的相对细一些吧,就是默认的固体surface与光照交互在shader中具体是啥样的。
UE4在渲染方面倾向于代码统一易于维护,美术资源在端游手游也只需制作一份。为此,跨平台方面,在底层的DX, OpenGL, OpenGL ES, Metal, Vulkan等API上面搭了一层中间层,代码使用该中间层操作渲染。在Shader方面,只需写一个HLSL风格的Shader代码,由UE4将其编译成对应平台的代码,比如GLSL。
对于不同平台开发,在编辑器使用,渲染效果上面尽可能保持一致,比如PBR效果在端游手游上尽可能接近。同时不同级别的平台开放对应特性,比如中低端手机不支持GPU粒子
移动端使用Forward Rendering,渲染管线如下:
Views setup渲染前的处理,包括CPU层面的各种剔除(Frustum culling,Distance culling,Precomputed visibility)等。
需要OpenGL ES 3.1/Metal级别,使用GPU计算粒子位置/速度,这样可以计算大量粒子,比CPU效果好很多,结果存到texture给CPU使用。
设置深度缓冲,取得需要shadow的物体,只有主光源(一般是方向光)渲染shadow map,给后面的Base pass或Modulated shadow projection使用
首先将物体分组排序,根据材质属性,距离远近等。
然后开始渲染,具体着色包括:Lightmap(低质量),可以设置是否使用计算法线&光线方向的direct lightmap。一般情况下主光源为Stationary Directional Light。Stationary Light不将直接光照烘焙进去,而只是烘焙间接光照,也就是说Stationary Light可以动态调整强度和颜色。Lightmap不包括stationary方向光的直接阴影,有一个专门的shadowmap储存这个主阴影。这个单独的shadowmap使用的技术是distance field shadow,不会受到贴图分辨率的影响,能一直保持边缘锐利,这个stationary light的indirect shadow和其它static light的shadow会直接烘焙到光照图上。 这个是与diffuse color相乘,针对静态物体。
Cached point indirect light,这个是移动物体用的SH光照。可以通过调整static lighting level scale调整场景中光照小球数量,和lightmap精度匹配,这块儿可以修改一下,保持野外场景减少其数量的同时保证光照图精度。这个是与diffuse color相乘,针对动态物体。
方向光shadow计算(使用shadow map信息,该shadow map或者是直接读取静态物体的distance field shadow,或者是c步骤里面计算出来的CSM,两者可以融合到一起,不会造成阴影叠加阴影的错误显示效果)。
方向光的直接光照,这个基本是最主要的动态光照。这个包括diffuse和specular,针对静态物体和动态物体。
使用环境贴图的间接高光,也就是所谓的反射效果。环境贴图由反射球和天空光构成。针对静态物体和动态物体。
stationary的skylight(这个不推荐用,因为stationary skylight在移动端只有diffuse光照,这样会造成只有specular color的金属材质物体颜色完全为黑色,推荐使用static skylight,这样将其烘焙的光照图和reflection probe上)
动态点光源,多个,包括diffuse和specular,针对静态物体和动态物体。
自发光。
需要有取得场景深度的扩展指令,不支持光照,相当于在场景画好后后处理的样子。
和延时贴花很像,后处理使用shadow map画阴影,会在已有的阴影上再叠加一层,使用CSM更好。
画折射物体,透明物体,比如粒子。
只有打开HDR时才会开启后处理,包括多种后处理,bloom,light shaft,AA,Tonemapper等。
Slate/Canvas UI
Mobile的设置包括针对低中高平台的各种细节设置,比如LDR/HDR,是否不计算高光,是否无金属,反射精度等等,这些设置和上面的渲染管线,编辑器深度耦合,因此推荐在修改相关东西的时候也是直接修改相关编辑器和渲染管线内容,而不是另起炉灶,不然得维护两套东西。