Adicionando crateras XNA (via GPU) com um efeito "Burn"


11

Atualmente, estou trabalhando em um clone "Worms" 2D no XNA, e um dos recursos é um terreno "deformável" (por exemplo, quando um foguete atinge o terreno, ocorre uma explosão e um pedaço do terreno desaparece).

No momento, estou fazendo isso usando uma textura que tem um valor vermelho progressivamente mais alto à medida que se aproxima do centro. Eu percorro todos os pixels dessa textura "Deformar" e, se o pixel atual se sobrepuser a um pixel do terreno e tem um valor vermelho alto o suficiente, modifico a matriz de cores que representa o terreno para transparente. Se o pixel atual NÃO tiver um valor vermelho alto o suficiente, escurecerá a cor do terreno (fica mais preto quanto mais próximo o valor do vermelho estiver do limite). No final desta operação, eu uso o SetData para atualizar minha textura do terreno.

Sei que essa não é uma boa maneira de fazê-lo, não apenas porque li sobre barracas de oleoduto e similares, mas também porque pode se tornar bastante lenta se muitas crateras forem adicionadas ao mesmo tempo. Eu quero refazer minha geração de crateras na GPU, em vez disso, usando o Render Targets "pingue-pongue" entre ser o alvo e a textura a ser modificada. Esse não é o problema, eu sei como fazer isso. o problema é que não sei como manter meu efeito de gravação usando esse método.

Veja como está o efeito de gravação agora:

Efeito de gravação

Alguém tem uma idéia de como eu criaria um efeito de gravação semelhante (escurecendo as bordas ao redor da cratera formada)? Não conheço completamente Shaders, mas, se necessário, ficaria muito agradecido se alguém me explicasse como fazê-lo. Se houver outras maneiras, isso também seria ótimo.


Respostas:


7

Uma maneira de fazer isso é semelhante ao que você tem feito. Tenha uma textura "Dano" e a textura de fundo real, mas em vez de copiar os dados a cada vez, mantenha os dois como duas texturas separadas.

Quando uma explosão é feita, desenhe um círculo na textura de Dano que tenha uma borda ligeiramente transparente. Essa será a área "queimar".

Sempre que você desenhar o terreno, forneça à GPU as duas texturas e faça com que seu shader multiplique a cor (.rgb) dos pixels de fundo por 1 - o valor alfa da textura do dano. Livre-se dos pixels totalmente pretos (alfa-los para 0, ou você também pode multiplicá-los para alfa (.rgba em vez de .rgb), dependendo se você deseja áreas translúcidas queimadas) e pronto!

Duvido que seja o melhor solução, mas é bastante semelhante ao que você fez antes, o que pode facilitar a transferência. Provavelmente, você também pode passar uma matriz de vetores3 (x, y, raio) e fazer algumas contas no shader com base nesses pontos de explosão, mas não tenho certeza quanto à eficiência disso.

Espero que isto ajude!


Obrigado! Essa é uma maneira legal de fazer isso também, e semelhante ao que estou fazendo agora, como você disse. Não sei nada sobre HLSL, mas definitivamente vou investigar. Outra maneira que me disseram que eu poderia fazer é escurecer quando me aproximo da borda da cratera, mas vou tentar dessa maneira também.
Benixo 7/04
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.