核心挑战:血迹斑驳的地面
《末日来袭:狂潮》视觉特效的一大挑战在于,屏幕上随时可能出现大量敌人,而且它们可能在同一时间被团灭。在我们制作游戏原型时,敌人最初会触发一个“爆破游戏提示”(Burst Gameplay Cue),从而生成血迹贴花留在地面上,并产生血色爆炸效果,给予玩家视觉反馈。但我们很快发现(尤其是在武器升级后),你可能在短时间内同时触发大量死亡事件。因此我们必须对这些效果进行优化,确保战斗能实现极致混乱的效果,而不会因数量过多导致出现性能瓶颈。
对于血迹贴花而言,我们原本的设计初衷是让它们留下些许屠杀感,同时就像操作记录足迹一样,告诉玩家他们曾经走过哪里、击杀了什么。问题在于,这些贴花会大量生成——这意味着它们会迅速叠加,而我们希望它们能在场景中保留较长时间,这样才能达到我们想要的效果。另,还会出现贴花重叠的问题:玩家可能在很近的范围内击杀大量敌人,导致贴花彼此重叠,从而引发性能问题。
为了能在地面上生成大量血迹(甚至酸液!)标记,我们使用了Niagara创建一个系统,将一组世界空间区域渲染到一个渲染目标上。该数组长度固定,大约为256个条目,并且会循环使用——所以当256个条目用完后,第一个条目会被更新为第257个,以此类推。这个数量在测试中表现很好,可以让地面被“血腥覆盖”到一定程度后再开始循环利用条目。
现在,当一名敌人被击杀时,它不会再生成贴花,而是会将自身的数据(位置、半径、材质类型)发送到我们游戏世界中持久存在的一个蓝图Actor——“Splat Manager”(喷溅管理器)。
然后,这个管理器会将数据发送到一个全局Niagara系统中,该系统通过高级着色语言(HLSL)结合Grid2D数据接口,将这些区域写入一个全局渲染目标遮罩中。这个系统的核心实现很大程度上借鉴了Terrible Posture Games技术总监Chris Zuko的工作成果。我们通过计算每个血泊的距离来填充渲染目标,距离范围由传入的半径值定义。所有距离数据最终会合并生成统一的遮罩。
最终,这个经过扭曲的遮罩会在表面着色器中用于不同材质属性之间的混合,从而实现逼真的血腥视觉表现!