O texto abaixo foi publicado no PlayStation.Blog brasileiro.
Além do gameplay cativante, a Housemarque é conhecida pelos seus efeitos de partícula exagerados. Títulos como Resogun, Alienation, Matterfall e Nex Machina todos usam tecnologia própria de efeitos especiais para trazer explosões coloridas à vida na tela, e agradar os jogadores enquanto destroem inimigos ou completam fases. Em Returnal, a Housemarque mudou a câmera para terceira pessoa, e também para um estilo de arte muito mais escuro e “pé no chão”. Nesta matéria, Risto Jankkila, nosso Lead VFX Artist, e Sharman Jagadeesan, Senior Graphics Programmer, nos mostram de perto como usam sua tecnologia de efeitos especiais para trazer o planeta alienígena de Atropos e seus habitantes à vida.
Abaixo você pode assistir o vídeo completo que mostra os recursos de efeitos especiais de Returnal. Além disso, vamos entrar em mais detalhes sobre esses recursos nesta matéria.
A história da nossa tecnologia de efeitos especiais
Temos trabalhado na nossa tecnologia própria de efeitos especiais desde Resogun (título de lançamento do PS4 em 2013), onde o primeiro protótipo do nosso sistema de partículas atual foi usado em alguns dos efeitos de jogo. Após Resogun, o sistema de partículas recebeu uma interface gráfica e começamos a chamá-lo de Next Gen Particle System (NGP). Em 2014 tomamos a decisão de produzir todos os efeitos de partícula de Alienation usando o NGP. Após lançar Alienation, o sistema foi usado em Nex Machina e recebeu uma versão para a Unreal Engine em Matterfall.
O NGP foi criado para ser um sistema de autoria de efeitos especiais apenas para a GPU, com aquecimento mínimo da CPU. O foco está em boa performance e flexibilidade. A criação de partículas é feita pelos artistas de efeitos especiais que escrevem trechos de comportamento de partículas e dados. O NGP cuida da alocação de memória e da maioria do código, enquanto os artistas focam no comportamento e visuais.
O NGP não lida apenas com efeitos de partículas. Ele também pode ser usado para controlar o comportamento dos voxels em volumes, ou para gerar dados que podem ser usados como input de efeitos.
Por exemplo, temos o nosso próprio módulo de simulação de fluido que alimenta os dados de simulação para o NGP. Outro exemplo é um módulo chamado ‘voxeliser’, que pode ser convertido em uma malha de voxels. Esses dados podem então ser usados para efeitos volumétricos de personagem. Outros recursos como texturas, matrizes de ossos e buffers de vertex também podem ser usados como inputs de efeitos de partículas.
A magia efeitos especiais por trás dos tentáculos dos inimigos e as trilhas de balas: nódulos de partículas
Logo no início do desenvolvimento de Returnal, ficou claro que queríamos fazer algo especial com as criaturas inimigas de Atropos. O diretor do jogo, Harry Krueger, queria que se parecessem com criaturas abissais, com propriedades bioluminescentes e tentáculos.
A nossa equipe de animadores experimentou fazer tentáculos usando partes de corpo tradicionais animadas para simular a física de conjuntos de ossos ligados aos esqueletos dos inimigos. Essa abordagem ficou um pouco limitada, já que o custo de performance de executar conjuntos muito grandes era muito alto, e também já que não tínhamos uma maneira de expressar o estado dos inimigos usando apenas simulação de física. Os. efeitos especiais então recebiam a tarefa de criar tentáculos dinâmicos que podiam ser ligados às malhas e esqueletos dos inimigos.
Por sorte já tínhamos uma solução em mente. A equipe experimentou com partículas de vegetação em projetos anteriores e um tipo especial de partícula que foi desenvolvido para vegetação com galhos, como árvores. Chamamos essa partícula de “Node Particle” para refletir suas propriedades e comportamento.
Este sistema de partículas nos permitiu criar conexões unidirecionais de mãe-filho. Uma partícula pode ser a mãe de múltiplas partículas, mas pode ter apenas uma mãe. Quando a partícula mãe lê os dados, eles são de apenas um quadro, ou seja, não os dados sendo escritos no quadro atual. Isso torna possível “seguir” a mãe estritamente, e resulta em um efeito colateral que torna o movimento das partículas parecer mais “orgânico” Esse efeito colateral é usado bastante nos efeitos de Returnal, e foi bastante útil para coisas como tentáculos.
Mas antes de começarmos a trabalhar no comportamento dos tentáculos, tivemos que decidir como renderizar-los. Primeiro, brincamos com a renderização de tiras planas de polígonos. A qualidade ficou quase aceitável, mas faltando um pouco de sombras e outros detalhes. Após um tempo, decidimos renderizar os tentáculos como malhas cilíndricas que foram criadas com o NGP.
Após decidir na renderização de tubos, pudemos começar a focar no comportamento dos tentáculos. Podendo controlar o comportamento das partículas, não ficamos mais restritos à simulação de física, e podíamos convenientemente alterar o movimento dos tentáculos baseado no estado do inimigo. Isso facilitou as coisas como forçar os tentáculos a se moverem de certa maneira quando o inimigo está se preparando para atacar. Iteramos no timing com a equipe de inimigos e com os designers para garantir que o comportamento dos tentáculos para garantir que o comportamento deles ajudaria a telegrafar os estado dos inimigos junto das animações e outros efeitos especiais.
Os nódulos de partículas também são úteis nas várias fitas e trilhas que temos no jogo. Queríamos que as balas teleguiadas tivessem uma trilha que ficaria na tela por um tempo, seguindo seu caminho. Os ataques corpo-a-corpo dos inimigos também usam efeitos de partículas. Abaixo você pode ver um vídeo dos nódulos de partículas seguindo sua mãe, criando uma fita de partículas, seguidos do ataque teleguiado de um Phrike.
Simulações fluidas
Um dos nossos princípios chave aqui na Housemarque no quesito efeitos visuais, é simular o máximo possível em tempo real, usando o mínimo possível de dados salvos. Como já tivemos partículas de fluido nos nossos títulos anteriores como Alienation e Matterfall, ficou claro desde o início que não aceitaríamos campos pré-montados de velocidade para Returnal.
Em vez disso, usamos uma simulação de fluido em tempo real em torno do jogador para simular o movimento do ar, que afeta o movimento das partículas, vegetação e outros elementos dos efeitos especiais. Além desta simulação (que chamamos de Global Fluid Simulation), temos simulações adicionais ligadas a elementos diferentes do jogo.
Qualquer evento de gameplay pode receber um script para adicionar força à simulação de fluido, o que causa uma reação nos elementos próximos de efeitos especiais. Por exemplo, essas forças podem ser incluídas nas animações dos inimigos de forma que quando eles saltam e atacam, adicionamos um impulso radial à simulação de fluido naquele momento e local. Isso faz as partículas próximas como folhas e faíscas serem jogadas para longe do ponto de impacto. No vídeo abaixo você pode ver impulsos de fluido sendo ativados das animações inimigas e das ações dos jogadores que afetam as partículas da vegetação.
Embora usar apenas velocidades fluidas era o bastante para coisas como vegetação, nos casos onde é possível ver partículas discretas de ponto, a simulação de fluidos global ficou um pouco falha. Para obter mais detalhes, escolhemos implementar cálculos de verticalidade opcionais para a simulação de fluidos e em uma atualização, adicionamos um campo de ruído à velocidade das partículas, proporcional à magnitude da velocidade no local da partícula. No jogo essa técnica foi usada para os hologramas e no efeito de teleportação do personagem, como você pode ver abaixo.
Voxeliser e efeitos volumétricos
Um dos elementos do ambiente que queríamos colocar no primeiro bioma de Returnal (Overgrown Ruins) foi a névoa espessa, como a de um cemitério. Devido às diferenças de altura nas nossas fases, a geração processual da névoa foi problemática. Em vez disso, decidimos colocar os volumes de névoa manualmente. Com um alto número de volumes colocados pela equipe de ambiente, então tivemos que tornar o processo o mais simples possível.
A flexibilidade do nosso sistema de partículas nos permitiu criar esses volumes no NGP. Como os dados e o comportamento das partículas pode ser completamente customizado, podemos usar um índice tridimensional para um número de partículas e pedir que representem um volume. Volumes podem passar dados constantemente do CPU para o NGP. Além do índice tridimensional, podemos guardar outros dados em voxels também. Isso nos deu a possibilidade de salvar estados diferentes para cada voxel em um volume. Além de poder gravar o estado dos voxels, podemos mudar sua lógica de atuação, baseado em seu posicionamento no mundo do game ou dentro do volume.
Com voxels que sabem seu estado e posicionamento, podemos fazer com que emita automaticamente mais densidade perto de superfícies como o chão ou paredes, e também ter as bordas com menos volume. Isso tornou o processo de colocar os volumes mais rápidos, já que a névoa se adapta automaticamente ao seu ambiente. Também pudemos fazer o sampling da simulação de fluido global pelo posicionamento dos voxels, para que a névoa seja movida por coisas como o vento, balas, ou aa ações do jogador. No vídeo abaixo, você pode ver um desses volumes de névoa do NGP sendo colocados em uma fase. A densidade da névoa é criada e adaptada às superfícies, e advectada pela simulação de fluidos do game.
Juntando tudo para criar a luta contra o chefe Phrike
Para a luta de chefe contra Phrike, quisemos emitir névoa volumétrica da malha do esqueleto de Phrike. Isso criou um problema, já que a névoa volumétrica e as malhas de esqueletos são criadas usando dois tipos diferentes de elementos. A malha do esqueleto é uma série de vértices, pontos animados em um espaço 3D, que mandamos formar triângulos que podem ser renderizados. Os vértices podem ser colocados arbitrariamente de todo jeito para criar formas diferentes como árvores ou humanoides. A névoa volumétrica, por outro lado, usa caixas que chamamos de volumes. Esses volumes são compostos por elementos menores, os voxels. Ao contrário da malha dos esqueletos, os volumes de névoa na Unreal Engine sempre possuem o formato de caixa, assim como os voxels que os compõem.
Se queremos apenas usar os vértices de Phrike para criar névoa volumétrica, teríamos que descobrir em qual voxel da névoa está cada vértice da malha. Isso foi trivial para resolver, mas o problema maior foi o fato de poder usar apenas um voxel por vértice. Ter dois vértices ocupando o mesmo voxel levaria a comportamento imprevisível, e possivelmente até causar uma pane no jogo. Para piorar, a chance é muito maior de haver mais de um vértice em um único voxel, do que apenas um.
A solução foi usar um voxelizer em tempo real. O voxelizer usa a malha do esqueleto como input e tem como output um volume onde cada voxel dentro da malha do esqueleto é marcado como ocupado. Isso tornou o processo de emitir névoa simples, já que tínhamos apenas que checar o output do voxelizer e ver se o voxel em questão está marcado ou não. No vídeo abaixo você pode ver o output do voxelizer usando a malha de Phrike como input.
Podendo emitir névoa da malha de Phrike, pudemos então melhor fundir o personagem com o ambiente quando se movia. Também tornou as ações especiais de Phrike como a teleportação, mais fáceis de executar, já que podíamos esconder essas transições com a névoa. Abaixo você pode ver um vídeo de comparação da sequência de Phrike com névoa volumétrica, e outros efeitos sem.
Isso conclui o nosso mergulho nos efeitos especiais de Returnal. Esperamos que você tenha gostado de ler isto e deseje compartilhar mais de nossos truques e técnicas no futuro.