Ajout de cratères XNA (via GPU) avec un effet «Burn»


11

Je travaille actuellement sur un clone 2D "Worms" dans XNA, et l'une des caractéristiques est un terrain "déformable" (par exemple quand une fusée frappe le terrain, il y a une explosion et une partie du terrain disparaît).

Pour le moment, j'utilise une texture qui a une valeur de rouge progressivement plus élevée à mesure qu'elle approche du centre. Je fais défiler chaque pixel de cette texture "Déformer", et si le pixel actuel chevauche un pixel de terrain et a une valeur rouge suffisamment élevée, je modifie le tableau de couleurs représentant le terrain en transparent. Si le pixel actuel n'a PAS une valeur rouge suffisamment élevée, je noircis la couleur du terrain (il devient plus noir plus la valeur rouge est proche du seuil). À la fin de cette opération, j'utilise SetData pour mettre à jour ma texture de terrain.

Je me rends compte que ce n'est pas un bon moyen de le faire, non seulement parce que j'ai lu des informations sur les stalles de pipelines et autres, mais aussi parce que cela peut devenir assez lent si de nombreux cratères sont ajoutés en même temps. Je veux refaire ma génération de cratère sur le GPU à la place en utilisant les cibles de rendu "ping-ponging" entre être la cible et la texture à modifier. Ce n'est pas le problème, je sais comment faire ça. le problème est que je ne sais pas comment conserver mon effet de brûlure en utilisant cette méthode.

Voici à quoi ressemble l'effet de gravure en ce moment:

Effet de brûlure

Quelqu'un a-t-il une idée de la façon dont je créerais un effet de brûlure similaire (assombrissant les bords autour du cratère formé)? Je ne connais pas du tout les Shaders, mais si cela l'exige, je serais vraiment reconnaissant si quelqu'un me montrait comment le faire. S'il y a d'autres moyens, ce serait bien aussi.


Réponses:


7

Une façon de le faire est similaire à ce que vous avez fait. Ayez une texture "Dommage" et la texture d'arrière-plan réelle, mais au lieu de copier les données à chaque fois, gardez simplement les deux comme deux textures distinctes.

Quand une explosion est faite, dessinez un cercle sur la texture des dommages qui a un bord légèrement transparent. Ce sera la zone "brûler".

Chaque fois que vous dessinez le terrain, donnez au GPU les deux textures et demandez à votre shader de multiplier la couleur (.rgb) des pixels d'arrière-plan par 1 - la valeur alpha de la texture des dommages. Débarrassez-vous des pixels entièrement noirs (les alpha à 0, ou vous pouvez également multiplier cela en alpha (.rgba au lieu de .rgb) selon si vous voulez des zones brûlées translucides) et le tour est joué!

Je doute que ce soit la meilleure solution, mais elle est assez similaire à ce que vous avez fait auparavant, ce qui peut faciliter le transfert. Vous pourriez probablement aussi vous en sortir en passant dans un tableau de Vector3 (x, y, rayon) et en faisant quelques calculs dans le shader sur la base de ces points d'explosion, mais je ne suis pas sûr de l'efficacité de ceux-ci.

J'espère que cela t'aides!


Merci! C'est aussi une façon cool de le faire, et similaire à ce que je fais maintenant, comme vous l'avez dit. Je ne connais rien à HLSL mais je vais certainement y jeter un œil. Une autre façon dont on m'a dit que je pouvais le faire était de le noircir à l'approche du bord du cratère, mais je vais essayer de cette façon aussi.
Benixo
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.