Origin
zhuanlan.zhihu.com
Tags
性能优化
渲染
风格化
项目
破晓传说
收藏夹
创建时间
收藏类型
Cubox 深度链接
更新时间
原链接
描述
来自 CEDEC2019 株式会社——小林弘幸
概述:
初次以本世代主机为主 (要渲染品质) 的系列作品
本次作品的美术目标:
—要表现成熟、存在感与紧迫感
—要让新作有品质飞跃提升的感觉
- 实现该目标的技术与秘诀
—要保留作为系列特征的动漫风格的美术氛围
- 要有手绘水彩的插画感,色彩考究,细节要清楚传达
美术侧的一些需求:
要充分利用渲染技术来呈现画面 (降低对手绘绘技术的依赖)
- 要满足大资源量与大量人员协同开发
渲染相关开发目标:
- 使用 UE4 作为引擎开发环境
- 渲染功能兼容已有与自定义实现。
—绘制方式调整
—降低消耗,提高开发便利性
- 改进开发便利性和图形渲染品质
- 增加美术可自定义范围
—增加专有技术的未来可复用性
- 在本次演讲中,我将重点介绍自定义实现的部分。(所有图片为正在开发中的效果)
美术效果展示:
目录: 一:渲染管线概述 二:环境光照与阴影 三:大气与体积雾的实现 四:体积云的实现 五:角色光影 六:更高性能的半透明渲染 ※在本次讲座中,我们将以 PS4 中(1080p)的一些渲染数值为例。 对于 Xbox One,ARISE 也使用了相同的优化策略。
一:渲染管线概述
渲染流程设计策略
• 延迟渲染 + 其他 Pass 阴影过滤
—采用延迟光照设计
• DepthPrePass(全分辨率)+ BasePass 绘制(Gbuffer 生成)
—首先是减少渲染算法的 GPU 消耗
• 美术方面需要实机进行确认,调整比较困难的部分
—模型顶点数据消耗增加,但是…
• 可以利用减面或 LOD 工具(美术易于调整的部分)
• 在模型绘制上尽可能采用异步计算
—以实现 “隐藏” 绘制消耗的目的
绘制深度与 Gbuffer
渲染
异步计算
模型绘制管线
异步 PrePass
渲染
异步计算
异步 PrePass
- 与 Depth PrePass 同时执行
- 处理可以从帧开始就立即计算的元素
・后期处理的一部分
・一些缓冲区的初始化
・屏幕空间 GI(漫反射 GI)
・体积照明和雾
・体积云绘制
异步 BasePass
渲染
异步计算
异步 BasePass
- 与 BasePass 同时异步执行
- 只要深度固定,可计算处理的目标。
・基于 Tile 的灯光剔除
・基于 Tile 的屏幕空间阴影
・ 屏幕空间反射
・ 基于 RayMarch 的高度图阴影(中景到远景的实时阴影)
・低成本且兼容太阳方向的动态变化(太阳方向的 RayMarch)
异步 AO 与延迟阴影
渲染
异步计算
异步 AO
- 在绘制阴影贴图的同时异步执行
- SSAO
・基于比例的环境遮蔽
- 高度图 AO
・ 从较高位置开始,比例略大的 AO
异步延迟阴影
- 使用遮挡剔除和分 Tile 绘制的异步执行
- 在屏幕上绘制阴影
・阴影贴图
・高度图阴影
・云影
直接光照、着色器及过滤器
渲染
异步计算
直接照明
- 平行光源(太阳光)
- 点光源、聚光灯
・ Tile
- 倍增光
・用于阴影和着色
阴影 + 过滤器
・用于间接光
・用于雾和云的绘制
・用于增强画面插画感效果
・用于阴影颜色控制、轮廓线、过滤器
- GPU 绘制时,要注意 GPU 的负载的元素
・两者都会运行许多全分辨率的 Pass
・着色模型(人物 / 背景)因绘制需求不同而有所差异。
- 理想情况是能够从负载的角度对角色和背景执行专用着色器
・ UberShader 尽量精简(减少注册压力和 Wave 占用率)
・ “获取着色器 ID⇒条件分支⇒执行专用着色器” 也很浪费(全屏)
⇒ 使用深度着色器掩码执行着色器(HiZ 测试)
使用深度创建着色器蒙版
• 根据着色器 ID 创建深度蒙版
– 16 位深度
– 着色器 ID ⇒ PS 到深度导出(DefaultLit 是初始值 ⇒ z 压缩)
– PS4 大约 0.1 毫秒
- 利用 EarlyZ + HiZ(每个图块的深度测试)
- 批量执行 DefaultLit + Foliage(背景照明)
- 批量执行 DefaultLit + Foliage + Unlit(背景阴影、过滤器)
- 角色素材批量或单独执行(照明,阴影,过滤器)
- 仅为特定材质执行专用着色器(注意测试的粒度) HiZ & z 压缩效果
※关于模板
– 基于其他目的、压缩、HiS 处理等的角度来选择深度。
半透明与后处理
渲染
异步计算
- 半透明
- 混合分辨率渲染(在的幻灯片中)
- 后期处理
- Bloom + Glow(无阈值的模糊发光)
・为了能够绘制 Glow 专用的材料(怪物使用)
- Temporal AA 和 SMAA 的混合体
・ TAA 是异步计算的
GPU 消耗
渲染
异步计算
Gpu 消耗(PS4)
AsyncCompute 对 GPU 基本没额外占用
(graphics 和 Wave 分配恰当即可)
调整 Wave 的并发执行次数很重要(Wave Limit)
• 对于每个着色器
• 对于每个模型
二:环境照明和阴影(间接光和过滤器)
环境间接光表现
- 基本实时计算(不包括 IBL)
– 对应照明环境的动态变化(阳光、路灯等)
– 资产配置⇒ 专注于可以立即检查外观的环境(工作成本)
- 间接光包含
– 天光 + 反射 IBL
– AO(SSAO + 高度图 AO)
– 屏幕空间漫反射 GI
– 屏幕空间反射
屏幕空间漫反射 GI
- 对周围环境反射和颜色的变化做 Trick
– 光照效果及材质的自发光等。
设置(AsyncPrePass)
应用于场景 (着色 Pass)
需要考虑像素的法线和深度
- 降低模糊缓冲区的访问次数 (这里访问 3 次)
- 辅以强度校正
前景中的自发光作用于远景时:
PS4 上的 GPU 消耗:
屏幕空间反射
可通过深度计算的平面反射
– 过场动画和现场运动中最明显的反射是地板表面(负载响应)
- 支持基于光泽度的反射
• 模糊宽度根据粗糙度而变化
– 实现为基于 Ray March 的多级反射
效果:
反射计算(AsyncBasePass)
应用于场景 (着色 Pass)
• 比较像素法线朝向和上方向做淡入淡出
–法线方向做 UV 偏移(轻微)
• 根据粗糙度插入对应模糊反射缓冲区PS4 上的 GPU 消耗:
半透明的 SSR
• 采用不透明和半透明计算方式通用的方法
–在材质计算时,SSR 会运行两次
背景着色与滤镜
- 滤镜处理以增加手绘水彩插图的感觉
–颜色变化阴影颜色、阴影中的颜色和阴影饱和度
–大气通透感和雾化效果在稍后的幻灯片中
–滤镜以改善手绘效果
效果:
滤镜处理概要
- 自定义 SNN + 锐化 + 轮廓线
– 自定义 SNN
- 手绘模糊、渗色和表面破碎
– 锐化 + 轮廓(法线) • 添加少量细节
- 什么是 SNN 过滤器?
- 比较对角线像素并找到平均值
- 像素混合噪波后感觉良好
- 需要进行模糊、过滤器大小、性能等调整
如图对角线取像素的平均值 (颜色会更接近中心像素)SNN 的自定义元素
• 引入混合权重
–双边加权(模糊措施)
• 过滤器形状
–通过轮廓强度调整过滤器宽度
- 是横向还是纵向,及其强度等。
- 过滤强度 –根据相机距离变化 • 性能优化策略
–水平和垂直方向分开进行
- 7 + 7 个采样数
PS4GPU 消耗
三、大气与体积雾的实现
破晓中大气的表达
• 改善环境表现
–尘埃和沙尘、大气通透度、天气表现(风、雪)等。
• 画面的夸张表现
–夸大距离感和合适的细节量
–阳光和阴影表现上的强调
–手绘图片般的精致和细腻
• 上述效果在基于物理正确性下的调整
–着重性能上的优化
效果:
大气表现的构成要素——雾
雾 = Merge(高度雾,体积雾)
体积雾密度不均匀的动画——使用 Ray March 和 3D 噪声实现
(雾 + 阳光散射)* 太阳体积阴影 + 雾 * 局部体积照明
来自太阳方向的光散射效应
・仅考虑视线与光源的夹角
・不依赖于雾或深度的计算
・在抑制雾霾的同时让它看起来很漂亮
太阳的体积阴影——用于强调光的方向,增强印象
局部体积照明
点、聚光灯照明——Raycast + Ray March
每个元素独立计算,应用于场景时进行合并
—体积计算部分做了简化,计算精度也进行了调整
大气表现的构成要素——体积阴影
• Ray March 进行简化计算
–仅阴影积累
–DepthPrePass 和异步计算 (AsyncPrePass)
体积阴影的效果
- 表现光线传播中的阴影渐变
—增加大气对光线的散射感和细腻感
- 场景应用
—使用深度进行手动线性插值
—为每个地图增加阴影颜色
效果:
PS4 上的 GPU 消耗:
- 分辨率、样本数 / 光线、纹理数量和复杂度 / 样本
- 3D 贴图非常方便
- 降低分辨率
- 用于计算
四:体积云的实现
游戏中天空的表现
- 照顾广阔的天空(高度差、深度)
—天上的两颗星星其实是巨大的模型
—表现空间的层次结构鸟 ⇒ 卷云 ⇒ 山峰 ⇒ 远处的云 ⇒ 星星
- 体积云的目标
- 形状的复杂性(+ 不同天气的云)
- 干净的颜色
- 动态云卷云舒和消失的动画
- 用 Ray March 进行实现
效果:
云渲染的概述:
- 云的出现
–通过云层的透射和反射并被相机接收的光
–云渲染 = 光的衰减 * 遮蔽(阴影)计算
• 如何决定光线的衰减程度
–云层厚度 • 密度
• 厚度计算
–用 Ray March 计算
• 暗度计算
–定义一个很棒的密度计算函数 (这是云渲染的初始数据)
云的 RayMarch 计算
• 云层之间的 RayMarch
- 计算云的密度(绿色)
- 每次采样的光照计算
- 执行自遮蔽 RayMarch(黄色) 1. 这里称为 Shadow RayMarch
- 综合考虑密度的光照结果
- 被光线路径上的前景云所衰减
- 注意消耗 —50 次采样 * 10 次采样(阴影)= 550 次采样 —密度纹理的数量也很重要⇒2 张:1100 次,3 张:1650 次,4 张:2200 云密度图的计算 云的分布图:决定云的大体形状
上图:3D 纹理
XY: 512 * 512 水平方向空间
Z:16 个时间方向
Z 在时间轴上的变化 (MirrorRepeat)
每帧 2 张 Z 的线性插值
R 是 Perlin + Voronoi 噪声
细节噪点:添加更加精细的形状
3D 纹理
XY: 256 * 256 水平空间
Z: 32 空间高度方向
Perlin + Voronoi 噪声
Z 方向的张数少(考虑 RayMarch 的样本数)
效果:
云的绘制流程
• 以不同的 Pass(不同的分辨率)分别绘制阴影和云彩
效果:
绘制云的 GPU 消耗(PS4)
五:人物光影
效果:本作的角色渲染表现
• 基于写实并结合插画式风格
本作的角色渲染表现
- 基于写实并结合插画式风格
–成人与存在主义的表达
- 基于造型的法线引入 / 调整(衣服 / 金属)
- 从纹理的绘制到考虑光照的资产的调整
–插画风格:阴影的控制和色彩变化的丰富度
每种材质的阴影控制
(皮肤 头发 衣服 金属 眼睛)
加强颜色变化和光影变化
材质感增强 (金属反射等)
插画感的提升
降低赛璐璐的三维效果
每种材质都有单独的着色器来执行(使用深度着色遮罩区分)
加强颜色变化(ShaderPass)
• 对光照结果在着色器上应用颜色的变化
—应用颜色 LUT(每种材质都不同)
下面就本作中尤为重要的皮肤(面部)和金属部分会着重讲下
皮肤的渲染
- 重点强调一下令人难受的阴影(尤其是面部)处理的实现
—外观 + 减少艺术家法线调整的成本
主光源从上方照射的情况
控制皮肤阴影
- 使用立方体贴图烘培辅助灯光
–沿光源的光轴旋转
- 将亮面与光源方向对齐
–带方向的阴影校正
–亮度和对比度由美术进行调整
- 皮肤和眼睛:对比度较弱
- 在 UE4 编辑器中的调整变得容易
- 仅将皮肤光源的 z 方向缩放为 0
–主光源通常来自上方
–不会在下巴周围投射不愉快的阴影
–其他材质基本没有不适感
- 阴影贴图强度
–减弱难看的自阴影
–由艺术家进行调整 • 熟悉环境
• 熟悉皮肤和衣服等各种材料
面部细节强化
- 面部周围的信息量和对比度往往会降低 —在刘海和脖子周围添加动态阴影 • 刘海的阴影 —改变发型 + 支持头发运动 —Ray March 屏幕深度 • 脖子上的阴影 —专门的体积阴影 —深度比较的软阴影
应用滤镜 + 轮廓线
• 与背景相似的绘制过程
—使角色保持的细节更容易调节
• 主要目的
—降低脸部的立体感
—改进手绘插画感
• 适用于整个角色
角色金属质感的表现
• 角色表达中的重要元素(盔甲、武器等)
• 基于图像光照 (IBL) 的反射处理
—Cubemaps 对应每张地图
• 开发过程中出现的挑战
—对昼夜变化的熟悉程度
—对角色各种材质(亮度)的熟悉程度
—实时光线变化下的效果表现
• 在保持金属质感的同时来表现风格化
角色金属的光照
- 与角色的衣服光照基本相同。
—兼顾基础颜色(漫反射)和镜面反射的光照
—也要适合其他材质的亮度
—主光源方向的明暗对比
- 使用 IBL 来丰富金属的表现
- 使用屏幕空间 GI 颜色来校正局部反射颜色
金属镜面高光(粗糙度)降低
- 调整直接光高光的锐度(和强度)
—反射粗糙,高光锐利度
六:更高性能的半透明渲染
Mixed Resolution Rendering(混合分辨率渲染)
- 结合两种分辨率的半透明渲染
—减少渲染区域(半透明重绘)的消耗
在小分辨率下绘制半透明
在小分辨率下检出画面变化大的部分
在全分辨率下合成场景及绘制蒙版
全分辨率下半透明绘制
—仅在变化较大的区域以屏幕分辨率绘制
- 保留清晰的细节
—其他缓冲区与场景缓冲区的混合绘图⇒ 使用 ESRAM 方式(XboxOne)
最后:整体总结
概括
- 光照 + 阴影 + 滤镜结合的方式
—系列最新作品的更高品质 + 手绘水彩插画风格
- 通过积极使用异步计算来减少消耗
- 利用基于 Ray March 的渲染
—体积雾、体积云、照明效果等。
- HiZ 和 Z 压缩等的 GPU 硬件功能也非常强大
感谢您的倾听!!
特别鸣谢:
- 艺术指导
——岩本 稔
- 场景艺术
——梶原 優子、中村 基典、土佐 香織
- 角色艺术、角色 TA
——小林 美由紀、新井 誠馨
- 怪物艺术
——井爪 広樹、川口 徹
- 株式会社 • 万代南梦宫
参考文献
• Ramy El Garawany, 2016, Deferred Lighting in Uncharted 4, ACM SIGGRAPH 2016 • Emil Persson, 2007, Depth In-depth • Cyril Soler & Olivier Hoel & Frank Rochet, 2010, A Deferred Shading Algorithm for Real-Time Indirect Illumination, ACM SIGGRAPH 2010 • Tobias Ritschel & Thorsten Grosch & Hans-Peter Seidel, 2009, Approximating dynamic global illumination in image space, Symposium on Interactive 3D Graphics and Games 2009 • Peter Sikachev & Nicolas Longchamps, 2014, Reflection System in Thief, ACM SIGGRAPH 2014 • Michele Giacalone, 2016, Screen Space Reflections in The Surge • Yasin Uludag, 2013, GPU Pro 4: Hi-Z Screen-Space Cone-Traced Reflections • Nathan Vos, 2014, GPU Pro 5: Volumetric Light Effects in Killzone: Shadow Fall • Bartłomiej Wroński , 2015, GPU Pro 6: Volumetric fog and lighting • Benjamin Glatzel, 2014, Volumetric Lighting for Many Lights in Lords of the Fallen, Digital Dragons 2014 • Andrew Schneider, 2015, The real-time volumetric cloudscapes of horizon: Zero dawn, ACM SIGGRAPH 2015 • Andrew Schneider, 2016, GPU Pro 7: Real Time Volumetric Cloudscapes • Andrew Schneider & Nathan Vos, 2017, NUBIS: Authoring Real-Time Volumetric Cloudscapes with the Decima Engine, ACM SIGGRAPH 2017 • Sebastien Hillaire, 2016, Physically based Sky, Atmosphere and Cloud Rendering, ACM SIGGRAPH 2016 • Stephen McAule, 2018, The Challenges of Rendering an Open World in Far Cry 5, ACM SIGGRAPH 2018 • Jeremy Shop, 2009, Mixed Resolution Rendering, GDC 2009 • Padraic Hennessy, 2016, Mixed Resolution Rendering in Skylanders: SuperChargers, GDC 2016
最后——
本文为汉化《 AriseRendering_cedec2019 》,图片高清全尺寸全面汉化版。
转载引用,还请表明出处,谢谢。
> 本文由简悦 SimpRead 转码