Nosso desafio: pisos ensanguentados
Um dos desafios com os efeitos visuais de Let Them Come: Onslaught era a quantidade de inimigos na tela e quantos poderiam ser eliminados ao mesmo tempo. Quando criamos o protótipo do jogo, os inimigos acionavam um Burst Gameplay Cue que gerava um decalque de sangue no chão e uma explosão sangrenta como feedback para o jogador. Percebemos rapidamente que era possível acionar muitas dessas mortes simultaneamente, especialmente com armas aprimoradas, então precisávamos otimizar tudo isso para garantir que a ação fosse o mais caótica possível sem gargalos por quantidade.
Nos decalques de sangue, a ideia era criar uma sensação de carnificina e servir como trilha para o jogador, mostrando onde ele passou (e o que deixou para trás). O problema é que muitos decalques eram gerados, e queríamos que eles permanecessem visíveis por bastante tempo para serem úteis, o que fazia o acúmulo acontecer rápido. Também precisávamos lidar com o problema de sobreposição dos decalques: era possível eliminar muitos inimigos muito próximos uns dos outros, o que fazia os decalques se sobreporem e, muitas vezes, causarem perda de desempenho.
Para gerar uma grande quantidade de marcas de sangue (e ácido!) no chão, usamos o Niagara para criar um sistema que renderizava uma matriz de áreas de espaço do mundo em um alvo de renderização. Essa matriz tem tamanho fixo de cerca de 256 entradas e funciona em loop; quando as 256 entradas se esgotam, a primeira entrada é atualizada como a entrada 257 e assim por diante. Esse número funcionou bem: é possível cobrir o chão com bastante gore antes de reciclar as entradas.
Quando um inimigo é eliminado, em vez de gerar um decalque, ele envia dados sobre si (posição, raio, tipo de material) para um ator de Blueprint chamado “Splat Manager”, que é persistente no mundo.
O Splat Manager envia os dados para um sistema global do Niagara, que usa a High-Level Shading Language (HLSL) para gravar essas áreas em uma máscara global de alvo de renderização, usando a interface de dados Grid2D. Esse sistema foi fortemente inspirado no trabalho de Chris Zuko, diretor técnico na Terrible Posture Games. Preenchemos o alvo de renderização com a distância de cada poça de sangue, usando o raio recebido para definir esse alcance. Todas essas distâncias são combinadas para gerar uma única máscara consistente.
A máscara final, já distorcida, é usada para mesclar atributos de material no shader de superfície e deixar tudo com um visual bem sangrento!