《战神4》中的图形学技术——风场和植被交互系统
简单的风力与植被交互系统
一些基础教程通过自定义顶点着色器实现对植被面片模型的顶点扰动。简单的方法是根据时间对一张噪声纹理进行位移和缩放上的变化。依据遮罩纹理限制顶点变化值,再将变化值附加到原先的顶点位置上,从而实现植被的随风摆动效果。
至于与植被的交互则是需要记录玩家的行动轨迹Render Texture,根据Render Texture的信息对周围植被做出响应。
当然这只是简单的植被材质的实现。在此基础上可以做到更为复杂且看起来真实的效果。但是仅仅简单的方法不能满足角色挥砍武器等动作与植被的交互。同时这种实现方法的植被很容易就会感到重复,为玩家带来的代入感就会降低。
《战神4》中的风力与植被交互系统
风场的表达
结合上面提到的植被交互系统的优缺点,《战神4》制作组提出了明确的目标,需要清晰展现随时空变化风力的变化以及玩家交互。
在深入探讨如何表达风前,我们需要对风有更加深刻的认识。风可以看作一个场,这个场将位置映射到风力,风力自然是有大小和方向的矢量,且这个矢量会随着时间和空间变化。从最直观感受上看,生活中同一个位置的不同时刻风的方向和强弱均在发生变化,而同一时刻的不同位置风力自然也会有所区别。
理解了现实中的风,再来思考游戏中的风是如何表达的就简单了。《战神4》中的风场可以看作由环境风场与可交互风场两部分共同作用而成。环境风场采取和传统意义风场相近的方式来表示,即通过采样噪声纹理(Noise Texture)获取风力的大小与方向,再将数值输入给植被。可交互风场其实是只存在于玩家周围的一个Box Volume,它会跟随玩家并记录角色——包括玩家和敌人——的一系列行为对周围风场的影响。
环境风场
生成用于环境风场的噪声纹理
噪声纹理就是用于描述游戏中的环境风场的。常见的噪声算法有Perlin noise、Voronoi noise、Worley noise等。《战神4》制作组设计了一个多层噪声函数(Fractal Noise Function)(图1)。该函数固定不同参数下噪声纹理的缩放和频率,当参数发生变化时通过对数分箱的方式(Logarithmic Binning)(图2)获取其他噪声纹理并按权重融合,于是便得到了一个参数变化时噪声变化相对平缓逼真的效果。
噪声纹理的循环
当我们得到噪声纹理后,还需要获取噪声纹理的信息。如果只是随时间移动纹理,以实现受到风力影响的效果,这样会有效果重复的缺点。为了解决这样的问题《战神4》加入了三个额外的处理。首先在达到纹理边界时重设采样位置,其次是重设采样位置时需要对结果进行融合处理,最后重设采样位置时不再返回初始位置,而是随机生成一个新的位置并以相同方向和速度移动纹理。这样就获得了看起来随机且没有循环的环境风场。
可交互风场
可交互风场的定义
《战神4》将其称作Wind Simulation Volume,其本质是一个Box Volume。这个体积会包裹住玩家的周围环境,在这个范围内将玩家的动作信息写入纹理中。在这里可以使用3D纹理或者多张2D纹理,区别在于3D纹理是连续的,多张2D纹理是离散的,《战神4》使用的是多张2D纹理。通过记录体积内xyz轴风力的信息,将纹理做模糊处理后就可以根据记录的信息做对应的反馈了。
影响风场的风力产生器
下面先解决如何记录信息到纹理的问题。《战神4》定义了三种类型的基础几何体,分别是球体、圆柱体、圆锥体。另外定义了四种风力模式,通过修改这些几何体的旋转、位置再根据风力模式就能获得响应的风力信息。四种模式分别是:直线(Directional)、扩散(Omni)、漩涡(Vortex)、触发(Wake Motor)。直线模式与风力的方向相同,扩散模式以形状中心向四周扩散,漩涡模式围绕形状中心旋转,触发模式就是据速度动态调整风力大小,通常是其他模式叠加起来完成的效果。
风场作用的对象
音频
音频方面的反馈是通过WWISE音频系统实现的。《战神4》开放了风力速度等参数,音频发射器会接收这些参数,根据WWISE系统的属性实现不同的混音效果,从而实现类似多普勒效应的效果。
布料
虽然这部分的工作并没有应用到最后的发行版中,但却进行了相关的实践工作。具体的实现是每块布料会拿到作用于当前布料的大小,然后将力分配到每个顶点上,再投影到顶点法向量上,最后顶点更新位置。其实本质和布料模拟中的欧拉法大致相近,都是通过分析力然后计算速度更新位置。替代的这一做法是使用预先设定好的布料动画,或者将布料算作网格一类的反馈中。
粒子
粒子只会受到可交互风场的影响,每个粒子会采样其位置下的风速和风向,每帧计算粒子的冲击力使得风速与粒子速度同步。另外还需要根据风速缩放粒子噪声的扰动参数。
网格
这部分可以从两个方面和五个组件介绍。
美术部分
美术的主要职责是提供顶点数据和不同植被的相应参数。
顶点数据
美术需要提供植被的遮罩数据以及面片模型的顶点数据。
模型参数
模型数据则十分繁杂。对非树木类的模型参数有密度(Density)、运动影响因子(Movement Scale)、弯曲(Bend)、拉伸(Stretch)、刚度(Stiffness)、摆动弹力(Sway Spring)、摆动阻尼(Sway Dampen)。对于树木类的模型在此基础上还有树木模式(Tree Mode)、树木弯曲度(Tree Bend)、树木运动影响因子(Tree Movement Scale)、树叶延迟(Tree Leaf Lag)。
技术部分
技术部分需要在顶点着色器中处理顶点数据,并根据植被参数进行顶点的偏移。在计算着色器中则需要根据参数和给定的纹理计算不同植物的分布,并通过GPU Instance实例化大量的植被。
顶点着色器
密度(Density) 两个密度参数,一个控制高速时的密度,一个作用于低速时的模型形态。
运动影响因子(Movement Scale) 距离原始顶点位置的缩放。
弯曲(Bend) 控制植被弯曲时的形态。
拉伸(Stretch) 拉伸前记录原长,将位移量加到顶点位置上,在线性插值到原长,依次替代了对面片做旋转的复杂运算。拉伸系数影响这一步线性插值的大小。
刚度(Stiffness) 与布料中的刚度相同,越高植物看起来越硬。
摆动弹力(Sway Spring) 和摆动阻尼(Sway Dampen) 决定拉伸回原长时的作用力。
树木模式(Tree Mode) 开启则会使树干受到风的影响。
树木弯曲度(Tree Bend) 作用同前文的Bend参数,控制树木的弯曲程度。
树木运动影响因子(Tree Movement Scale) 作用同前文的Movement Scale参数,控制距离原始顶点位置的缩放。
树叶延迟(Tree Leaf Lag) 当树叶停止受到风的作用后,树叶回到原位后还会有些许晃动。当该参数越大晃动时间越长幅度越大。
计算着色器
计算着色器的主要任务就是生成环境风场的噪声纹理,并对其进行采样。主要就是依据前文所述方法进行采样,当采样位置到达纹理边界时,随机更新采样位置的坐标,并融合初始和结束位置的采样结果,以相同的方向和速度改变纹理的偏移量。有时采样点会有多个,于是可以使用Flow Mapping令其它采样点跟随某个采样点共同移动。但当采样点的移动速度不同时会造成明显的视觉错误。这是由于偏移量的改变速度不同造成的重设采样位置时刻不同导致的。解决这一问题是控制不同位移速度的采样点在淡出时的速度使得最终在统一时刻更新采样位置。
实例化
使用HLSL的DrawIndexInstanced直接绘制植被模型以及人物头发。避免了实时渲染时CPU不断向GPU传输数据的费时过程。
毛发(头发、皮毛、胡子)
对于头发来说,给定了几个在角色头皮上的锚点(不是网格顶点),将风力对顶点的偏移量赋给锚点的偏移量,然后再单位化。还有两种方法就是通过对网格顶点的移动实现头发的飘动,或者将前两个方法融合使用。
对于皮毛来说,大体和头发相近,但在单位化时需要对所有面片模型进行单位化。
对于胡子来说,一个角色的胡子由多个面片模型组成,不同的面片模型具有不同的参数。在受风力影响时与皮毛是相近的处理过程。
角色碰撞
《战神4》尝试了多种角色碰撞方案,记录角色行动轨迹,记录双脚轨迹等,但效果都不尽如人意。单纯记录角色行动轨迹会有台阶处的植被没有碰撞却发生碰撞反馈的情况,记录双脚轨迹则十分消耗性能且对翻滚动作没有反馈。于是想到了记录深度和行动轨迹结合的方法。
一张纹理使用两个通道,一个用于记录当前走过的深度,一个用来记录深度的淡出(图7)。对发生碰撞的草会向碰撞的方向偏移其顶点然后进行单位化,和上面提到的Stretch参数影响植被模型的过程相同。
对于大型角色和主要角色,碰撞体使用简化的多边形,小型角色使用其原本的网格碰撞体
性能优化
LOD
主要介绍了植被的LOD。当植被与摄像机距离远时使用低面片组成的植被,距离近时过渡到高面片的植被模型[9]。
这里运用了Card Cluster技术,通过程序化的方式构建不同层次细节面片模型。可以将6面的植被模型压缩到了2。构建方法如下:
A. 检测空间中所有的面
B. 将距离较近的面投影到同一面上
C. 面积最大且对其他面弯曲最小的面为下一层次的主面
D. 回到A直到面片数达到限制
黑边修复
通常的做法是在原图像基础上进行扩大模糊。虽然效果很好但速度比较慢,边缘还会有颜色偏差,玩家一般也不会注意到。
《战神4》选用的方法名为Mip Flooding。首先对纹理做Mip处理直到只有一个像素颜色,并记录这一过程中所有的压缩纹理。然后根据原图的alpha值进行筛选,对小于某一alpha的位置替换为对应的压缩纹理的颜色,得到的是四周经过压缩而中间清晰的纹理。这样的速度快,且压缩得比模糊处理好,占用的空间资源更少。
参考资料 References
[1] SeanFeeley. Interactive Wind and Vegetation in GodofWar[R]. SMS:GDC, 2019.
[2] Xavier Décoret, Frédo Durand, François X. Sillion, 等. Billboard Clouds for Extreme Model Simplification[J]. HAL Open Science, 2010(1).
[3] 球谐函数、编解码球谐系数,以及对Light Probe的重建和压缩 - 简书 (jianshu.com)
[4] 高质量实时渲染:实时全局光照 | YangWC’s Blog
[5] [gdc19]《战神4》的风力&植被交互系统_战神 gdc分享-CSDN博客