Origin
zhuanlan.zhihu.com
Tags
简悦
项目
收藏夹
创建时间
收藏类型
Cubox 深度链接
更新时间
原链接
描述
前言暗黑 4 正式上线了,截帧分析发现其实很多制作方式并不是很复杂。但是他们资源的制作非常标准,整体的设计能力也非常强大,怀着学习的心态逐步分析一下他们的制作方法

角色

以野蛮人的创角为例,分析一下基本的渲染流程和制作方式以及灯光和环境是如何搭建的
notion image

一、渲染流程

1、灯光方向的 depth,用来计算 shadowMap
notion image
2、绘制相机方向场景的 depth,和取到上一帧的 motion vector
notion image
notion image
3、Gbuffer 的绘制(一共 5 张数据,分别是 BaseColor , Normal , MotionVector, Depth, Mix(R: Roughness, G:Metal, B: AO, A:alpha))
notion image
notion image
notion image
notion image
notion image
暗黑 4 的 depth 绘制分了两步,在准备 Gbuffer 数据前先把非 motionVector 深度先画出来,Gbuffer 阶段直接取就成了,然后在 Gbuffer 中一步步绘制 motion vector 类型的深度
notion image
4、SSAO 绘制
notion image
5、DepthStencil 绘制
6、IBL 的光照计算
notion image
7、DirectionLight 光照计算
notion image
8、点光源计算
notion image
暗黑 4 的光照计算用的是 Stencil Light, 并没用传统的 Tile-Based Deferred Shading,在光源数量不是特别多的时候用这种方式相对来说更划算一些,毕竟可以省掉序列化过程的消耗
9、SSR 计算
notion image
10、IBL 的反射计算
notion image
11、SSS Blur
notion image
12、VolumetricFog 的计算
notion image
13、透明物体绘制
notion image
14、Tonemapping
notion image
15、绘制 UI
notion image

二、制作流程

1、眼睛制作
模型:创角界面和 GamePlay 做了区分,创角界面模型面数精度相对高一些,1920 个顶点,创角界面眼球并没有做视差的效果,但是 TimeLine 的时候做了相关效果
notion image
GamePlay 中做了眼球 3 级 LOD, 顶点数分布是 LOD0 498, LOD1 432, LOD2 432
notion image
notion image
notion image
贴图:创角界面和 GamePlay 下所用的贴图基本差不多,GamePlay 下的贴图尺寸比起创角界面缩了一倍
notion image
notion image
notion image
notion image
notion image
notion image
结论:从贴图和模型上来看,眼球部分并没有做一些特殊的处理,走的应该是统一的 PBR 光照模型, 然后 ShaderGraph 中 TA 做了一些效果的处理, 资源总共分了三套,TimeLine 一套,创角一套,GamePlay 一套。
2、头发制作
notion image
模型:制作方式也是传统的插片,分了几部分,一层打底,两层叠加,最上面一层来做发辫的基础结构,为了增加发箍的饱和度扣在上面一圈 mesh。后面用一圈插片的 mesh 来做发圈,用来柔和头发和发箍的过渡
notion image
notion image
notion image
notion image
notion image
notion image
贴图:头发贴图分别使用 BaseColor, Alpha, Normal, AO,头皮和发丝部分合在了一起
notion image
notion image
notion image
notion image
notion image
结论:从贴图的制作思路上来看,并没有用 UE4 的 Marcher 基于物理头发的那一套光照模型,看起来像是 kajiya 的那一套制作流程,我在游戏中特意改成浅色头发,效果上果然出了很多问题。发丝效果采用的是 Paragon 那一套,也是目前 PC 游戏常用的制作方式 TAA + Dither 那一套,对于全身像不需要把相机怼在脸上,这样的处理其实足够用了。而且美术制作也简单,直接用 alpha test,不用考虑透明排序的问题,也可以绘制深度。
notion image
但显然暗黑对发丝的处理效果并不是很好,能看出很多明显的锯齿
notion image
应该是 Dither 没经过任何处理。Paragon 的 Dither 是有根据 TAA 的 frameIndex 抖动头发的深度,从而配合 Taa 达到 SSAA 的效果并收敛,所以出来的效果还不错
notion image
手游的话没有 TAA 去 dither 的噪点还是推荐双 pass 来制作吧。总的来说暗黑 4 的头发制作可以参考美术部分的制作方式,不太建议用他的着色方式,可能觉得 kajiya 这一套性价比比较高吧,但是神海 4 kajiya + 的那一套其实计算量没比这个多太多,可以兼顾深色系和浅色系的效果。同时在移动端上也不会增加太大的消耗。最近用神海 4 的制作方式试了一下之前一直令人头疼的浅色系头发。(浅色系的头发最大的痛点其实就是层次感,深色系头发因为足够黑,所以有没有层次看的也不明显,但是浅色头发如果没有层次感,整个头发就会感觉很平。UE4 中会对头发做多重散射的处理来增加每根头发间的结构关系,也有对头发的 shadow 进行单独处理的)
notion image
得到的反馈还可以接受,虽然还没有达到神海这种效果
notion image
主要应该还是在美术制作方式上有些问题。还需要继续去研究,有兴趣的话可以点开下面链接去看一下具体的制作方式,以及光照计算。

3、身体皮肤

notion image
模型: 素模主要拆了三部分,分别是头、上半身 、下半身,头部把口腔也做了出来
notion image
贴图:
notion image
notion image
notion image
notion image
notion image
notion image
notion image
总结:总的来说角色部分制作都是中规中矩,有些制作流程还不如其他 3A 游戏的精细度。仅从制作流程上来看着色方面也并没有看出特殊的地方,如果想进一步了解还得去看汇编出来的 shader。目前看 shader 方面不管是次表面散射的 shadermode 或者是 PBR 的 shaderMode 貌似指令数都比之前看到的要少很多。皮肤的部分除了次表面散射之外甚至加入了部分 PBR 的计算。创角应该是角色最佳表现的地方,制作流程按理说应该也是最复杂的,但就目前截帧来看。并没有用到特别复杂的制作方式。捏脸界面看起来仅仅都是预制图和预制脸的替换。
4、短毛
notion image
短毛的制作方式大体思路也是多 pass,以创角界面后面的棕熊皮为例
notion image
总共绘制了 32 个 pass
notion image
得到以下的结果
notion image
值得一提的是优化做的很好,叠出来的 pass 走的 Instance,而且所有 pass 是用不透明物体画的,这一下子把两个消耗大头就给干掉了!GamePlay 中再根据相机的距离控制一下 pass 的数量,消耗降到了最低!
模型:是一个直接拍扁的片
notion image
贴图:也是常规的几张贴图,BaseColor, Normal, AO, Roughness
notion image
notion image
notion image
notion image
三、灯光布局
创角界面灯光分布是由 2 盏平行光 ,6 盏聚光灯和 2 盏点光源组成(为了观察更为直观,我直接将图转到 gama 空间)根据灯光方向的深度可以猜测出每盏光的大概方向(因为每盏光都有投影。。。)
1、环境光:目前只提供了光照,没有计算反射,可以看出金属部分都是黑的(IBL 的反射是在 SSR 计算后完成的)
notion image
2、两平行光照亮室外,室内完全不受影响,上方做了遮挡
notion image
3、一盏聚光灯做为角色的主光源,控制到只影响角色的范围
notion image
4、一盏聚光用来照亮场景重点表现的地方
notion image
5、一盏聚光灯做为角色的补光。从相反的方向只影响角色
notion image
6、一盏聚光作为场景的主要贡献光照,来照亮整个场景(方向是从门口射进来的,也符合光源的来源)
notion image
7、一盏聚光来提亮角色的暗部
notion image
8、一盏点光来提亮场景重点表现的剩余部位
notion image
9、最后一盏点光照亮左下角的场景
notion image

打光思路:

角色:角色的打光思路基本上是符合三点布光法,这是人物摄影照明中的基本布光光位。即主光、副光、轮廓光的光位连起来构成一个三角形。是人物照明中三种基本光线。一般游戏的角色展示界面都是用这种方式来给角色提供最佳照明。不同的游戏会有少许的不同,但核心思路是不变的。想要更详细的了解这种布光方式可以看一下以下的参考
场景:所有角色界面的场景布光都会比角色的布光要弱上几分,目的是为了不抢角色的表现。作为背景只要表现出一定的空间感,和层次感即可,暗黑 4 中通过室外的光照和和左上角的部分点光源。来拉开场景的空间关系和明暗对比。让玩家能注意到野蛮人风格的建筑之外又不抢本身角色的表现。

四、角色场景配置

目前看到就用了一个 Volumetric Fog + 特效片(灰尘流动的效果以及增加体积雾的层次对比)
notion image

场景

个人觉得场景是整个暗黑 4 游戏中做的最好的, 这次的《暗黑破坏神 4》回归了二代阴冷肃穆的暗黑风,画面和氛围的塑造上展现了一流的水平。
首先,低度奇幻的哥特式恐怖是整个游戏的美术主题,游戏采用 “重返黑暗” 和“中世纪风格美术”这两大方面来选择概念美术、场景美术和最终实装效果,为《暗黑破坏神 4》创造出一致的视觉风格。
总的来说暴雪这次在割我们这帮韭菜的同时也给出一份不错的答卷,目前也使这款游戏成为暴雪有史以来销量最快的一款。

一、渲染流程

和角色的基本差不多就不一一分析了,区别在于绘制深度之前会把常驻 UI 部分的像素给扣出来,减少这部分消耗
notion image

二、制作流程

1、地表

暗黑 4 作为一个俯视固定角度的游戏,呈现给玩家最多的就是地表,所有艺术的表现地表也占了绝大部分,所以暗黑 4 给了地表足够的丰富度和资源分配,地形做了曲面细分。目前截帧看到所有地表中地表丰富的时候每块儿 Terrain,顶点数可以高达 20w 左右,正常游戏视角,每屏差不多加载 6~8 个左右的地块,但是并不是所有地方都是这种量级比如
notion image
notion image
通过这两张图其实可以看出。地形资源的分配取决于地表上面设计的丰富度。如果上面覆盖大量的植被,地表本身的资源量其实并不多。如果仅仅想表现道路的细节程度,地表除了有一些建筑外,剩下的资源全给了 Terrain。这步其实在前期设计的时候就需要分配好。
1.1 制作方式
notion image
从高度图上分析,首先能看到上面有明显笔触的痕迹,所以肯定是有人工干预的生产,大的轮廓过于平整这应该是程序化生成的部分,所以地形的制作方式基本可以断定也是程序化生成 + 人工细节调整。这种制作方式倒不是什么新鲜事了,现在国内搞大世界的基本上都在走这套流程。问题就是谁的流程更完善,流程是否能双向传递。程序化的部分和人工干预的部分在结果上能相互叠加,但在流程上可以相互独立。
notion image
从 LayerMask 信息里也可以应证这一点
2、植被
2.1 草
notion image
我发现很多游戏的草都会用纯 Mesh 来替代 Alpha Test 的制作,虽然都走 Instance,但是这样也会产生大量的顶点。用纯 mesh 的制作如果想要达到和插片 Alpha Test 一样的密度,顶点数最起码多出数倍以上。不太清楚是不是因为如今的显卡处理大量的顶点数要比大量的 Alpha Test 快。
暗黑 4 的草的造型大部分都是这种爬着的。不知道是不是设计需要,还是为了让草的面积看起来更大一些,可以减少一些密度
notion image
暗黑 4 中草的表现在整个场景中感觉特别稳,很值得借鉴学习。贴图上用了两张 baseColor,也就是上图中左起第四,第五张。应该是用来做两种颜色差异比较大的插值。那张五颜六色,而且是在 VS 里面采样,肯定是用来做风力的了。第三张是采样了一下地表的 baseColor,应该是为了做同一钟类型,一大片之间的颜色变化。第二张 nosie 图,可能是做细节变化的。
2.2 树
notion image
notion image
制作上看起来和传统的制作方式有啥区别。不知道顶点法线有没有做相应的处理

3、道路

notion image
在玩暗黑 4 的时候,道路的表现效果让我觉得很惊艳。不同地貌间的道路系统让人感觉眼前一亮。本来以为暴雪会有一套非常强大的道路系统,但最后发现其实就是 Spline + Decal 来实现的
交叉的部分就是做好的一个现成的 Decal 通过 RVT 和地表融合在一起,跟着地块一起渲染出来
notion image
notion image
非交叉部分是用 spline 生成的 mesh
notion image
notion image
融合部分并没有用到 Alpha,也是用 RVT 来进行融合,这样也可以避免透明物体的绘制。一开始我还因为第三张图是 alpha 通道,把资源扒下来后,试了下发现透明度有点高,贴在地表上根本表现不出来暗黑 4 那种明显的道路感。而且这张图精度相比其他图大小也小了很多,其他都是 1024 x 512 的贴图,唯独他是 128x256。后面看了下代码发现用他来和 RVT 图做 lerp,所以了然了。
notion image

3.1 道路交互

交互的部分做的也比较暴力,直接根据人物的位置和旋转值在相应的位置生成 decal
notion image
总结:地表表现部分核心技术其实就是 RVT + Decal + Spline, 剩下就靠 LA 本身的美术素养来搭建。

4、水

notion image
暗黑 4 中的水看起来并没有什么亮点。但是比较有意思的是水是当做不透明物体来渲染的,透明的部分取的是上一帧 sceneColor, 通过 lerp 来模拟透明。并没有用 Depth 来做边缘的融合
Foam 和 FlowMap 竟然是直接手刷上去的,真佩服暴雪这帮老艺术家的脚踏实地
notion image
暗黑 4 对透明物体的使用真的非常谨慎除了避免不了的粒子之外,其他的能用不透明代替的就用不透明来替代
notion image
甚至这种血溅的效果也是用 Alpha Test 来替代,虽然丢失了部分效果。但是不影响整个画面的表现力。
交互:这部分并没有截到相应的帧,只能凭效果猜测一下制作方式。应该不是波动方程计算得到的,首先,扩散的效果没有波动方程算出来那么自然,其次中间有很多小涟漪的点缀,涟漪的扩散效果过于死板和统一,应该是粒子做出来的效果然后拍在水面的法线上
notion image
notion image

5、场景物件

暗黑 4 场景 PBR 物件都是通过 大的结构关系 + deail map 来说实现的。以其中一个资源为例
notion image
notion image
其他的制作都是标准 PBR 流程
如果有功能性的需求,比如说积雪,苔藓之类的需求会有额外的一套资源来根据法线的方向来进行融合
notion image
暗黑 4 PBR 资源制作都非常规范我看了上百个资源,不管是角色还是场景物件。挑不出任何毛病,现在国内很多美术为了增加所谓立体感(立体感可以通过 AO,和 Normal 来提升),喜欢在 baseColor 上面叠阴影。。。。。。这样话阴影的地方永远是照不亮,这样做可能在单独某个光照环境下可以达到不错的效果,但是换到别的光照环境或者暗一些的场景,就会死黑。也没办法做到资源的统一,资源不统一,最终出来的画面效果肯定乱七八糟。
6、TOD 相关
6.1 雨
notion image
做法其实也是 ATI 的 “Toy Shop” Demo 这一套
notion image
暗黑 4 通过降低雨水的透明度和增加方向的变化,来削减屏幕后处理贴片的感觉。人物移动的时候做一些位移或者方向的变化来模拟雨水的空间感上的差异。
6.2 雪
notion image
雪是由粒子发射器实现的
notion image
notion image
启用地形的曲面细分配合置换图做出雪的沉积感
notion image
notion image
交互部分应该也是用 decal 生成一张置换图和法线

7、光照

场景中 IBL 的反射和创角不同,是在光照中最先计算的,因为暗黑 4 的场景并没有开 SSR,所以没必要把反射放到最后进行,目前截到的场景是没看到 SSR 相关绘制。
场景是的主光一盏平行光,有许多的聚光灯和点光来进行补光
角色也加了好多补光,目前我能看到对角色起作用的就有 5 盏。而且不同的时间段,甚至不同的场景还都不一样。怪不得 TOD 要做成离线的呢。这根本没法控制啊,完全是靠美术的工作量 堆起来的。。。这也完全没法分析啊!!!!!再见,下一个。。。

UI

notion image
所有的 UI 都做了一次 Tonemapping 的计算,第一张图是张 3D Lut 图,和 Unity 的 HDRP 管线一样,把 colorgrading 和线性转 Gamma 合在一起做了,颜色之所以有差异可能是转的色彩空间不一样导致的
Unity 是转到 ACES 色彩空间
notion image
暗黑 4 这样做的目的应该是为了让 UI 在线性空间进行正确的混合
UI 部分没必要做详细的分析,值得一提的是血条和能量条的制作,作为暗黑独特的标志,从一代延伸至今。
notion image
notion image
主要由三部分组成
notion image
notion image
notion image
核心是第二步绘制,血液的变化是动态的
notion image
通过 Stencil Test 来控制血液显示的区域
notion image
用 basecolor 和 Normal 算出一个简单的光照(dot(N,L) 来增加血瓶的体积感,加入 UV 的移动来模拟流动效果,为了模拟最佳效果,可以采样两次不同方向移动和 Tiling 的 UV。再根据 UV 的 V 方向的值输入一个动态参数来进行裁剪。可以实现血量的变化,把临界线图的位置根据前面的 UV 变化值对上。最后再加上高光图,基本就差不多了。
能量瓶的思路基本差不多,但是要加入一个扭曲的计算。

总结:整体流程分析下来,给人的感觉并不是很复杂,会有种我上我也行的错觉,但是为什么国内至今没有类似成就游戏的出现?平台?技术?还是资源生产的工业化管线?平台肯定是一部分原因,毕竟现在国内游戏产商的重心都放在移动平台上。各种性能的限制,没办法去承载游戏人的雄心壮志。技术呢?和国外差距太大?我恰恰认为这是国内最不缺的。国内大厂这种人非常多,他们往往非常低调,从不在各种平台发文章,除非是公司硬性规定,会在内网发几篇。资源生产的工业化管线?这个的确是目前国内的一个硬伤,工业化的生产管线往往是需要时间去积累的,国外 3A 工作室差不多有 20,30 年的积累,国内并没有哪家游戏公司能沉下心去做这种事,因为这个是需要花时间去积累的,而且前期的收益并不是很大,所以很多被扼杀在了 3 到 5 年这个阶段。有这个时间我都能做出 2 到 3 款游戏了。如果运气好出个爆款。。。何必去在乎品质呢。。。,不过最近几年很多公司已经意识到这方面的重要性了。我知道最早做这件事的是网易,其次是光子。米哈游《原神》的 48 天一张大地图的更新也让大家看到商业化的成功。英雄互娱我知道常楠和孙彻也在推这件事,不知道如今搞得怎么样了,不管如何,国内游戏研发环境都在朝好的方向在发展。希望若干年后国人也能做出一款属于自己的 3A.


▎本文由 简悦 SimpRead 转码。