Como a chama foi implementada em Doom no Playstation


Um capítulo inteiro do meu Game Engine Black Book: DOOM é sobre as portas de console do DOOM e os desafios que seus desenvolvedores encontraram. Você pode falar por um longo tempo sobre a falha completa no 3DO, sobre as dificuldades em Saturn devido ao mapeamento de texturas afins e sobre a incrível "engenharia reversa a partir do zero", feita por Randy Linden para a Super Nintendo.

Movendo-se inicialmente na direção que levou à catástrofe [1] , os desenvolvedores do porto para Playstation 1 (PSX) puderam mudar de rumo e criar um porto que foi bem-sucedido entre os críticos e o mercado. O DOOM final foi a primeira porta verdadeira comparável à versão para PC. Os setores de cores com mistura alfa não apenas melhoraram a qualidade visual, mas também melhoraram a jogabilidade, indicando a tecla da cor desejada. Também graças aos efeitos de reverberação da Unidade de processamento de áudio do console PSX, o som foi aprimorado.

A equipe de desenvolvimento executou um trabalho de alta qualidade que ainda possuía alguns ciclos de CPU gratuitos que eles decidiram usar para gerar fogo animado na introdução e no jogo . Isso me levou a uma admiração tão grande que decidi descobrir como o efeito era realizado. Quando as primeiras pesquisas não deram uma resposta, eu estava me preparando para tirar o pó de um livro do MIPS para decifrar o arquivo executável, mas Samuel Villarreal respondeu ao Twitter a tempo de já ter concluído o desenvolvimento reverso da versão para Nintendo 64 [2] . Foi o suficiente para eu limpar um pouco, simplificar e otimizar.

Foi interessante redescobrir esse efeito demosceno clássico; a idéia subjacente é semelhante à primeira ondulação da água , incluída no conjunto obrigatório de programas de muitos desenvolvedores dos anos 90. O efeito do fogo tornou-se uma testemunha viva do momento em que a combinação de uma paleta de cores cuidadosamente selecionada e um truque simples era a única maneira de alcançar o resultado desejado.

Ideia básica




Na sua essência, o efeito de fogo usa um mapa de elevação simples. Uma matriz do tamanho da tela é preenchida com 37 valores no intervalo de 0 a 36. Cada valor é associado a uma cor de branco a preto e captura amarelo, laranja e vermelho ao longo da estrada entre eles. A idéia é simular a temperatura de uma partícula de chama que sobe e esfria gradualmente.


O buffer do quadro é inicializado completamente preto (preenchido com zeros) com uma única linha branca de pixels brancos na parte inferior (36), que é a "fonte" da chama.


Cada vez que a tela é atualizada, o “calor” aumenta. Para cada pixel no buffer de quadros, um novo valor é calculado. Cada pixel é atualizado levando em consideração o valor localizado diretamente abaixo dele. No código, o canto inferior esquerdo é o índice zero da matriz e o canto superior direito tem o índice FIRE_HEIGHT * FIRE_WIDTH - 1.

function doFire() { for(x=0 ; x < FIRE_WIDTH; x++) { for (y = 1; y < FIRE_HEIGHT; y++) { spreadFire(y * FIRE_WIDTH + x); } } } function spreadFire(src) { firePixels[src - FIRE_WIDTH] = firePixels[src] - 1; } 

Observe que a linha 0 nunca é atualizada (a iteração sobre y começa não com 0, mas com 1). Essa linha cheia de zero é o "gerador" de fogo. Uma versão simples com resfriamento linear (- = 1) fornece uma saída uniforme e chata.


Podemos modificar ligeiramente a função spreadFire () e modificar a taxa de decaimento dos valores de calor. Adicionar aleatoriedade é um bom ajuste.

  function spreadFire(src) { var rand = Math.round(Math.random() * 3.0) & 3; firePixels[src - FIRE_WIDTH ] = pixel - (rand & 1); } 


Já está melhor. Para aperfeiçoar a ilusão, pode-se distribuir aleatoriamente não apenas acima, mas também esquerda e direita.

  function spreadFire(src) { var rand = Math.round(Math.random() * 3.0) & 3; var dst = src - rand + 1; firePixels[dst - FIRE_WIDTH ] = firePixels[src] - (rand & 1); } 


[Nota pista: o YouTube aperta terrivelmente o vídeo, é melhor assistir à demonstração em Javascript no artigo original ou abrir o GIF sob o spoiler.]

Animação por chama GIF (23 megabytes)
imagem

Voila! Observe que, alterando o processo de propagação da chama, o vento também pode ser simulado. Vou deixar isso como um exercício para os leitores que conseguiram ler o artigo.

Código fonte completo




A versão de Samuel (logicamente) parecia mais uma versão de montador. Se você quiser ver, existe uma versão limpa e simplificada.

Referências




[1] Fonte: História completa detalhada em Game Engine Black Book: DOOM

[2] Fonte: 25 de março de 2018 no Twitter.

Source: https://habr.com/ru/post/pt435122/


All Articles