本文首发知乎
https://zhuanlan.zhihu.com/p/569093979
总结了一下目前比较流行的做法并加粗、总结了一下手机上会比较合适的方案,现分享如下。
天气系统概述:
一个比较完整的天气系统大体包含:
下面就每种效果介绍对应实现方案:
光照:
一、实时光照
1、实时大气散射程序化计算
荒野大镖客2:
http://advances.realtimerendering.com/s2019/slides_public_release.pptx
将天气系统光照参数融入大气散射公式,通过调整大气密度、大气厚度等参数来改变天气效果。
几乎所有3A平台都统一使用这种基于物理的大气系统来实现。包含:寒霜引擎、教团1886,地平线黎明
2、美术指定颜色插值过渡或程序自动过渡
天刀:
虽然天刀使用了大气预烘培方案,但该方案的光照并不支持天气效果。因此,大概率:
美术指定光照颜色来进行程序自动化过渡。
程序自动通过调节晴天照明参数来实现天气的照明。
国内包含昼夜变换的PBR类PC游戏基本使用这种方案。
3、美术指定光照(过渡)
完全由美术指定梯度色,通过时间由程序进行插值过渡。比如原神,由美术预先提供一张颜色梯度图供程序调用。
天刀的夜晚颜色,国内包含昼夜变换的大多数手游均使用该方案。
4、灯光、场景或通过后处理直接压暗
国内很多含有天气系统的手机游戏,绝大部分采用该方式。
二、环境光照:
1、环境漫反射:
一个比较全的环境光漫反射做法:荒野大镖客2
可见性(阴影遮蔽):复用云的可见性纹理。
天光:来自大气散射(瑞利/米氏),并将其重要性采样为低分辨率抛物面(穹顶观察位置的MatCap)纹理
视锥内的间接反弹光线使用辐照度探测场获取(类似Light Probes)并乘上环境光遮蔽
这是一个非常完整而全面的环境光照明体系。手游方面会近似性或简化性的使用其中的一部分效果。
比如:
云遮蔽和云的光线投射,会直接使用一张噪波图罩到整个场景上,来模拟云影的效果,舍弃大气散射和云投射效果。天气系统可以配合更换这张噪波图或直接数值调整遮蔽部分的范围和遮蔽强弱,即可模拟不同天气下云对地面的环境影响。
天光通常在Unity中使用Color Grade的三阶色来进行模拟,完全抛弃实时大气散射的影响。这部分可以由美术实现调整好不同天气的三阶色,通过程序实时过渡来实现天光的模拟。
间接光线反弹效果,这部分因为手游性能限制,很多会将除平行光以外的所有光照效果都烘培到球谐探针上,而不止是光线的间接反弹。但这部分是预烘培死的,大部分是用来模拟场景中的人造光源,因此可以不随天气系统进行改变,或由程序稍加调整。
其他方案还有诸如:
量子破碎的屏幕空间照明
体素照明、光追等方案。
2、环境镜面反射:
1、光线追踪
NV当初的光追Demo:光明记忆
目前3A游戏高效模式下,基本都支持光追。
这种反射能完美再现场景效果,不需要针对天气系统进行额外操作。
2、屏幕空间反射
赛博2077:
3A游戏在非光追模式下的反射解决方案,基本为标配。部分手游(延迟管线)如:原神(对可动物件或开放环境中的水)中也有应用。
这种反射也可以完美再现场景的可视部分的效果,不需要针对天气系统进行额外操作。
3、反射探针(环境立方图)反射
绝大部分手游解决方案,原神在中也大量应用。
因为环境图为预烘培,因此需要针对不同天气做必要的修改,例如可以简单调整明暗。
原神中则配合延迟渲染,对CubeMap做独立照明:
生成Cubemap的基本色、法线
根据反射矢量获取Cubemap信息
根据获取到的Cubemap信息进行延迟光照渲染。
也有部分3A游戏会在相机附近计算实时的Cubemap,而非预烘培。
4、镜面反射
目前手游中对反射要求较高的部分场景会使用该方案。
例如我们游戏中的海水反射。
这种反射能完美再现场景效果,不需要针对天气系统进行额外操作。
大气环境:
一、云
1、体积云
荒野大镖客2:
使用全局云图 + 细节噪波 + 高度形状控制Lut图来程序化生成云。
改变天气时,会根据天气状态获取对应高度和形状的云图进行特定云形状的模拟。
云的光照则通过前面提到的大气散射程序化计算获取。
目前主流3A游戏均通过该方式实现。
附:主要云层种类及高度:
2、模型云
光遇:
使用3D噪声沿法线扭曲顶点 + 多层渲染做法。
引自WalkingFat博客,后附带链接
可以实时的与场景光照产生交互,甚至可以将光照、阴影直接烘培到LightMap中。
因为3D噪声图和模型形状都是预生成,因此无法跟随天气系统改变形状。如果要配合天气改变云层光影,则需要实时进行光照。这种做法更适合云上效果。
3、面片(粒子)云
崩坏3、原神
需要预生成如下云形状图:
分别用RGBA通道来模拟云的光照、边缘、厚度和半透明。
无法根据天气改变云的形状、密度等(可以多张云图过渡实现),可以由美术设定各种天气的光照效果,云自动进行匹配。
拓展:还可以根据光照方向,生成多张云光照图(就是R通道那张),然后根据光照角度进行实时过渡,来模拟云的光照交互。
4、天空球
绝大部分手游采用的云制作方案:
可以通过美术设定不同时段天空梯度色,由美术插值过渡的方式来实现昼夜变化。
由美术设定各种天气状态下云的颜色,由程序根据天气状态在各种颜色中进行插值过渡。制作效果主要取决与天空球的写法。
二、大气散射和雾
因为几乎所有手游都不具备场景的大气散射效果,基本都是依靠雾效进行过渡模拟,因此将这部分进行合并整理。
1、RayMarching
3A游戏中的大气散射都是基于物理实时计算的,雾的实现差别也不是很大,基本都是通过RayMarching方式实现。
荒野大镖客2中的全局雾与局部雾:
全局雾通过雾图(起始高度、衰减距离和密度)来实现,其中会混合天气和时间参数来实现浓淡过渡。
局部雾通过美术放置雾效体积(圆或方形)来实现,混合模式为叠加或混合。这部分应该会和全局雾效一样,混合天气和时间参数来实现浓淡的过渡。
2、后处理雾
大部分PC游戏及部分手机游戏中,经常使用的雾效实现方式。
不同与上面的RayMarching方案,只会采样场景深度一次,通过还原世界坐标来添加雾效,主要用于延迟渲染中。
因为手机并不支持大气散射的实时计算,这部分的效果通常就由雾的颜色来部分承担了。给场景雾效根据高度和距离来设定不同的颜色过渡,用来模拟大气散射的效果。配合天气效果时,也需要美术设定好不同天气下的雾颜色,由程序插值过渡实现。
3、顶点雾
绝大多数手游采用的方案,也是Unity的距离雾默认的方案。
配合天气效果时,也同上一种处理方案一致。
天气特效:
一、雨
雨的实现方案主要有两种:
1、粒子
就是在相机前方一定范围内放置雨滴的粒子系统来实现。
例如:我的世界、逆水寒
引自:网易游戏雷火事业群,后附链接
引自:网易游戏雷火事业群,后附链接
2、面片
创建锥体Mesh,通过雨滴纹理的UV流动来模拟下雨。
例如:天刀、原神
二、雪
与粒子系统雨做法一致,将纹理换成雪即可。
天刀中的雪
附:雪花主要形状
三、闪电
1、特效方面:
一般端游或3A游戏,都是通过程序实时生成。
荒野大镖客2:
手游通过半透明闪电纹理图来实现。天刀手游:
2、照明方面:
3A游戏基本通过添加大范围点光源的方式来进行实现。
天刀方案:将主光源对齐闪电到相机方向,并调整平行光亮度来实现。
类似点光源计算方式,不进行光源添加,只是程序传入材质必要的几个参数,进行类似点光源的计算。
场景反馈:
一:天气特效交互
1、雨
场景物体被雨打湿后的效果表现。
从PBR角度来说,打湿后的效果应该更像物体表面覆盖了一层薄薄的清漆(未形成积水阶段)。其主要影响如下:
相较于大部分非金属物体(F0——0.02)来说,水的反射效果更强。因此视觉上,被打湿的物体,其反射效果会变明显。
水的流动性会导致其在物体微表面维度上起到“整平”的效果,从而视觉上会让物体表面的反射更趋于平面(降低物体表面法线影响,降低物体表面粗糙度)。
因为额外增加了一部分光线被反射及透射吸收,就会导致物体表面接收到的光线亮度下降,从而降低了物体的漫反射效果,就是物体表面会变暗。
而以上这些影响,一定程度上取决于两块:
物体本身的粗糙度。
物体本身的F0值。
这就是大理石、水泥、土地被水打湿前后,变化程度并不一样的原因。
暂时没有找到相关论文论述,但制作3A游戏的天气系统,吸湿度这项参数应该会有某种程度上的体现。
手游中做法比较简单:
降低漫反射强度
提高反射强度
逆水寒中的一段叙述。
引自:网易游戏雷火事业群,后附链接
流动(手机不建议做):
基本理论做法都一致,将世界“下”方向转到切空间作为噪波纹理UV流动方向,再叠加法线斜率调整UV流动速度,之后用噪波扭曲模型各张基本纹理即可。
不同游戏的主要差别在于:
噪波图的实现方式。可以通过世界空间坐标实时生成,也可以使用3D噪波纹理,也可以使用UV空间的2D噪波纹理。
是否支持物体旋转。决定了需不需要将“下”方向转切空间。
手游很少有支持该效果的,因为性能消耗较大。
积水与反射(手机不建议做):
积水位置的效果类似于水面效果,根据不同平台性能实现对应的效果即可。
引自:网易游戏雷火事业群,后附链接
这里主要需要讨论干燥和积水过程之间如何进行过渡及如何确定积水位置的覆盖区域。
自动计算——逆水寒:
根据场景地表坡度自动计算积水区域。
引自:网易游戏雷火事业群,后附链接
随机平面——天刀:
水平位置即被认为为积水区域,是否通过叠加一张2D噪波图来做随机性,原文章并未叙述。
美术手绘——精细化控制
PC或3A游戏:在地面面数较高的情况下,通过笔刷工具,将积水位置直接绘制到模型顶点色上。
https://www.bilibili.com/video/BV15y4y167pq
手游:绘制到一张低分辨率的地面积水纹理上,类似逆水寒做法,但手绘,可控性更强。
水花飞溅
用粒子系统在相机前面一定范围内播放序列图即可。
涟漪(手机不建议做)
在积水达到一定程度的水平表面,通过叠加法线的方式实现。
天刀:
实时计算涟漪
与屏幕雨滴做法类似,以切割物体表面UV的方式,产生涟漪效果。
2、雪
覆雪
可以参考蔡骜这边写的做法,一般游戏的覆雪都是这么做。
主城生态调研(https://bytedance.feishu.cn/docs/doccniYLPpAItnAriypWICkjMZd#XtRUwO)
雪闪效果(手机不建议做):
3A游戏一般都使用2015Siggraph的论文制作。
一、UV成型
二、离散为梯度
三、根据菲涅尔等参数调节大小和密度
四:叠加噪波
五:各向异性光照
脚印
3A游戏:战神4
蝙蝠侠:
一、配合视角和纹理优化对雪地表面进行曲面细分。
古墓丽影崛起:
二、在角色下方放一个短视距相机拍摄脚底高度(多人)或传入角色位置(单人)。
三、对高度图边缘或者根据角色位置对中心做凹陷,边缘做隆起。
四、对雪地表面顶点做高度偏移。
手游:
天刀:没有。
原神:
跟随脚底的脚印特效(带法线)。
2、相机后处理:
屏幕水滴、屏幕水雾
3A游戏中比较靠谱的一种做法
https://zhuanlan.zhihu.com/p/298606553
但性能消耗较大:
UWA这边有一份测试报告
https://blog.uwa4d.com/archives/UWALab_Raindrops.html
手机中:
暂时没有看到很好的项目应用。可以尝试将上面方案做一些简化,例如:将消耗比较大的模糊雾效、多循环雨滴都去除,只保留单次循环的单雨滴效果。
屏幕结霜效果
屏幕叠加冰霜图Mask,通过Noise进行溶解消融实现。相对来说,这种效果更偏向于玩法逻辑层,只有处于低温状态(异常状态)或配合角色呼气才会出现这种屏幕效果,该效果一般天气系统不会随下雪附带。
总结
手机上比较现实的方案:
光照:美术调节晴、雨、雪三种光照状态,程序根据天气插值过渡。
环境:全局漫反射使用场景环境光,同光照做法。镜面反射使用场景自带的Cube。
大气环境:云和天空,如果美术使用程序化天空球,可以以调节材质参数颜色的方式定义天气,程序插值过渡。如果使用纹理画死的天空球,程序只能两张天空纹理插值过渡。
雨:粒子和面片方案可以任选一种。
雪:粒子系统制作。
闪电:特效使用多闪电形态随机选择的方式。照明使用程序实时调节平行光参数的方式。
场景打湿效果:只通过调节金属度和粗糙度的方式来模拟实现,不进行表面流动等特殊效果的制作。
水花:粒子特效制作。
雪:覆雪使用法线朝向混合做法,不进行表面闪烁效果的制作。脚印要么不进行制作,要么使用类似原神的面片特效方式制作。
后处理:都不建议制作,或者只制作最简单的雨滴效果(单水滴低落,不会有拖尾、雾化等效果)。
主要参考:
顽皮狗:城市环境实时雨夜
https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.330.5234&rep=rep1&type=pdf
R星:荒野大镖客2大气环境
腾讯:天刀昼夜天气系统-从端游到手游
绿美迪:量子破碎多尺度全局照明
网易:游戏中雨天效果开发
https://zhuanlan.zhihu.com/p/111904859
米哈游:从手机走向主机,《原神》主机版渲染技术分享
https://www.bilibili.com/video/BV1Za4y1s7VL
基于模型的体积云
http://walkingfat.com/bump-noise-cloud-3d%E5%99%AA%E7%82%B9gpu-instancing%E5%88%B6%E4%BD%9C%E5%9F%BA%E4%BA%8E%E6%A8%A1%E5%9E%8B%E7%9A%84%E4%BD%93%E7%A7%AF%E4%BA%91/
雨滴屏幕效果
https://zhuanlan.zhihu.com/p/298606553