作者介绍
大纲
介绍
当前市场上使用UE4开发手游的情况
天堂II 革命
天堂II 革命
Netmarble Games(网石游戏)使用标准的UE4特性进行该游戏的开发
UE4 移动平台渲染器
UE4渲染器
UE4拥有3个不同的渲染器
特性集
特性集介绍
•ES2
•Mobile渲染器
•对应OpenGLES2.0-3.x(Android平台) OpenGL ES2.0(iOS平台,支持ES3.0的IOS平台已经能够支持metal, 所以直接使用metal渲染器)
•支持最大8个纹理单元
•Android平台:
ES3.0扩展的支持
Fallback到32位RenderTarget
特性集介绍
ES3_1高端Mobile特性集
•Mobile渲染器
•OpenGLES 3.1(Android平台) Vulkan(Android平台, Android7.0) Metal(iOS平台)
•最大16层纹理单元支持
•浮点RenderTarget支持
•VertexTextures Fetch支持
•sRGB支持(可以支持硬件Gamma校正,但此处一般使用更简化的Shader计算代替,方便统一低配与高配机的效果)
特性集介绍
•SM4
•延时渲染器
•Direct3D10OpenGL3.0 Metal支持
•最大16层纹理单元
•支持延时渲染的最低特性集
特性集介绍
•SM5
•延时或者前向VR渲染器(Forward+)
•Direct3D11, OpenGL4.0, Playstation 4, XboxOne, Metal, GLES3.1 +AEP
•16+纹理单元支持
•支持Tessellation(曲面细分)的最低特性集,可以利用Compute Shader完成一些高级渲染特性支持。
特性集(Android)
打开黄框选中的特性可以让UE4生成ES3_1特性集使用的Shader
•UE4在对应设备执行时会自动选择最匹配的RHI(抽象硬件接口)和特性集
•
•这些配置可以被设备配置重写
Android Vulkan介绍
Vulkan是虾米?
•用来取代OpenGL和OpenGLES的次世代的渲染Api。
•由工业派设计,克拉魔发起。
•专为下一代硬件设计。
•
支持Vulkan的UE4(Android平台, iOS官方标配是Metal, 不支持Vulkan)
•运行Android7.0的设备现在自带一个可工作的Vulkan驱动。
•轻量级的Api, 最小化Cpu开销。
•“PipelineState Objects”带来高效的渲染状态切换。
•更多的渲染批次,因为每个渲染批次更轻量化
•???大意应该是按“RenderPass”组织方式带来更高效的Gpu硬件利用率(字被人挡住了。。。)
这里是Epic官方的Vulkan示例(可以自行查阅相关视频)
颜色缓冲区(HDR模式)
对比延时渲染器, UE4移动渲染器使用一个前向渲染器, 仅输出颜色,而不是使用Gbuffer。
•场景颜色
•理想的情况在支持的设备上使用16位浮点RenderTarget。
•不支持的情况使用“ RGBE 编码”或者“马赛克”模式(??Whatis “mosaic”mode???)。
•在渲染过程中RGB存储HDR颜色值。
•Alpha通道用来存储后续会使用到的深度值(软粒子,贴花)。
•
•深度缓冲区
•通常使用24位深度,8位模板的模式。
•
•后备缓冲区
•32位RGBA。
•存储后处理和Tonemapping后的最终结果。
RGBE HDR 编码
RGB + 指数 的编码方式需要被低端移动设备使用(运行Android5.X的GalaxyS6/Note4等)
•需要 EXT_shader_framebuffer_fetch的扩展(该扩展在GalaxyS6上可用)
•支持full HDR, bloom 而且没有分辨率限制。
•
从图中可以看到Native HDR和“Encoding” HDR的实现基本没有区别
颜色缓冲区(LDR 模式)
•32位硬件后备缓冲区 & 深度缓冲区
•系统分配(比如Android上的EGL)
•许多移动设备并不支持sRGB
•
•场景在Gamma空间中被直接渲染到后备缓冲区,随后透明物体和UI也被直接渲染到后备缓冲区
•最快的渲染方式(一般给简单游戏或者VR游戏使用)
移动平台渲染管线
1.视口建立
2.GPU粒子模拟
3.渲染阴影图
4.基础Pass渲染
5.贴花处理
6.混合阴影处理
7.半透明物理处理
8.后处理 & ToneMapping
9.HUD& UI
1. 视口建立
•查询所有可见物体
•视锥裁剪
•距离裁剪
•预计算的可见性(类似U3D的Umbra,离线计算场景的可见性,运行时通过少量开销即可判断静态物体的遮挡情况)
•关联的可见性
•查询所有可见阴影
•收集动态Mesh项
•更新视口相关的UniformBuffer
2. GPU粒子模拟
•需要支持OpenGLES3.1的设备
•
•在GPU上对粒子进行模拟
•
•将粒子位置写入128位的目标中
•
•将粒子的速度写入64位的目标中
3. 阴影图渲染
•准备深度绘制目标
•查询所有产生阴影的对象
•使用主光视角对这些物体进行渲染
•阴影图将在后续过程被使用
•在基础Pass阶段处理CSM阴影的时候使用
•随后,在需要混合阴影投影的地方使用
前面已经对使用UE4开发高品质的手机游戏的UE4渲染器、特性集和渲染管线做了介绍,这篇文章是要对它下面部分进行介绍,结合这两部分的干货内容,大家才能更好的去利用UE4引擎做出一款好的手机游戏。
4. 基础Pass(准备阶段)
• 根据阴影和灯光的属性为物体选择合适的Shader
• 无光模式
• 预处理的距离场阴影 + 光照图
• 预处理的距离场阴影 + 光照图 + CSM(用于处理动态物体阴影)
• 动态光照(一般与CSM阴影配合)
• 其它
4. 基础Pass(绘制阶段)
绘制所有拥有不透明材质的物体(同时计算物体光照), 在HDR/线性空间输出场景颜色
• 动态的方向光和点光源(逐像素光照, ps中计算光照)
• 静态的距离场阴影
• 动态的CSM阴影
• 静态灯光产生的光照图
• 天光
• 反射
4. 基础Pass(渲染顺序)
物体的渲染顺序由设备决定
• 不需要任何排序的情况
• 支持TBDR的芯片,一般都支持 “HiddenSurface Removal”(“隐藏面消除”)
• 重新按从近到远的顺序对每个列表进行排序
• 最小化状态改变
• 重新按从近到远的顺序对所有列表中的所有物体进行排序
• 最小化Overdraw
• non-ImgTec GPU的默认选项
• 你能够根据自己的需要对该行为进行定制
• r.ForwardBasePassSort = x
5. 延时贴花
• 需要场景深度获取的功能
• 通过支持的扩展实现
• GL_ARM_shader_framebuffer_fetch_depth_stencil
• GL_EXT_shader_framebuffer_fetch
• GL_OES_depth_texture
• 深度缓冲区解析
• 支持“Receives Decals”标识
• 模板操作
• 贴花不支持光照
6. 混合阴影投影
• 与延时贴花类同
• 不能与静态光照进行比较好的混合
• 静态光照 + CSM是一个更好的选择(4.12+)
7. 半透明物体处理
• 利用Base Pass时使用的相同Shader,在半透的混合模式下对图元进行绘制。
• 不对深度缓冲区进行写操作。
• 反射支持
• 需要完整的场景颜色拷贝。
8. 后处理
• 仅在HDR打开的时候才被支持
• 根据效果使用的情况需要一些额外的Pass
• 景深
• 自定义的后处理材质
• Tonemapper Pass发生在最后阶段
• 将HDR 颜色映射到8位每通道的RGB颜色
• 同时将颜色值写回后备缓冲区
• Bloom也在该阶段应用
• Filmic tonemapping(4.13+)
9.HUD & UI
• 直接将UI对象绘入后备缓冲区
• Slate BP(蓝图)
• 幕布(Canvas)
• 交换后备缓冲区
光照: 全动态光照
移动的方向光 + CSM阴影
• 编辑器准备
• 方向光组件,“Mobility” 属性设置为 “Movable”
• 设置“Dynamic Shadow Distance Movable Light” 的值
• 设置“Num Dynamic Shadow Cascades”的值
• 优点
• 所有的光都是动态的,都可以被运行时修改
• 减少内存大小和包体大小(因为没有预计算的光照信息)
• 缺点
• 所有在场景中的物体,不管是静态还是动态的,都需要被CSM渲染
• 额外的渲染批次和CSM生成开销
静态方向光
更简单的移动平台光照准备
• 直接光和高光被逐像素计算
• 强度和颜色能被运行时改变,但光的方向不能被改变
• 编辑器准备
• 方向光组件中,将“Mobility”属性设置为“Stationary(1 supported)”
• 将“Cast Dynamic Shadows”属性设置为“False”
优点
• 更快的渲染速度
• 高质量的距离场阴影
缺点
• 光的方向不能运行时改变
• 仅支持混合角色阴影
• 内存和包体大小因为预计算的Shadowmap等信息变大
静态方向光 + CSM阴影
4.13版本的优化
• 不再需要对每个物体设置是否接收CSM阴影的属性。
• 编辑器准备
• 方向光组件,将“Mobility”属性设置为“Stationary(1 supported)
• 设置“Dynamic Shadow Distance Stationary Light”的值
• 设置“Num Dynamic Shadow Cascades”的值
• 禁用 “Inset Shadows For Movable Objects”选项
优点
• 静态几何体通过距离场阴影产生静态阴影
• 动态角色阴影能够很好的与静态阴影混合
缺点
• CSM生成消耗(仅仅只包含动态对象)
• 基础Pass需要一个额外的纹理单元(用于CSM阴影)
动态点光源
与其他光照准备独立
• 每个物体/表面支持最多4个点光
• 将“Max Movable Point Lights” 设为大于0的值, 该选项在Project Settings/ Engine Rendering中
优点
• 当成基础Pass的一部分进行渲染,所以不会产生额外的渲染批次
缺点
• 需要额外的shader计算
灯光通道(???没有搞明白这东东的作用)
灯光通道在4.13及以上版本被支持
• 限制:每个物体仅一个静态或者动态方向光能被应用
后处理 – FilmicTonemapper
• 对于美术来说可以更自由的获取他们想要的视觉效果。
• 通过控制台变量启用
• r.tonemapperfilm(4.12-5.15)
• 4.15默认开启了该选项
• r.mobile.tonemapperfilm(4.16+)
• 因为有额外的性能开销,建议仅在高端机上使用。
自定义后处理过程
• 自定义后处理过程
• 通过材质系统创建后处理Shader
• 自定义深度
• 算定义深度(4.14新增)
• 选中的物体可以被渲染到一个独立的深度缓冲区中
• 这个独立的缓冲区可以在自定义的后处理中被采样
后处理 – 自定义模板值
自定义模板值(4.15新增)
• 在PC上可以直接对模板缓冲区中的模板值进行采样
• 在移动GPU上不能进行该操作
• UE4通过渲染到一个独立的颜色缓冲区的方式支持该功能
非渲染部分
移动平台的补丁和DLC支持
最小化的APK/IPA + DLC 打包向导(4.13)
• 极小的包体下载(AppStore/GooglePlay)
• 仅需要下载内容时显示的UI
• 从云端下载游戏内容和补丁
• 强制用户内容更新
移动平台的补丁和DLC支持
“Mobile Patch Utilities” BP 库(4.14)
• 通过BP控制下载安装处理过程
• 进度条 & 错误处理
• 存储空间
• Wifi 可用性
• 其他
大Apk包体支持
• 在中国分包模式不可行(阿西, 专门提到中国), 然而在某些情况下大包体在一些设备上不能正常工作
• 4.16开始这个问题被修复,现在不存在APK包体大小的限制了
4.16中的移动平台改进
• 更小的Android执行程序
• 更改编译器的选项移除不使用的代码
• UI 相关蓝图的性能优化
• Android的运行时权限获取
4.16中的移动平台改进
• 材质节点新增“VertexInterpolator” – 对移动优化极其有用(???使用VS中的插值代替PS插值)
开发中的移动平台功能
• 更快的帧迭代时间 –Android平台
• 改进的 编辑器内 移动平台预览
• 改进的PC iOS版本发布
• 简单的远程工具链安装
• 远程日志输出?