XNA Hinzufügen von Kratern (über GPU) mit einem "Burn" -Effekt

11

Ich arbeite derzeit an einem 2D "Worms" -Klon in XNA, und eine der Funktionen ist "deformierbares" Gelände (z. B. wenn eine Rakete auf das Gelände trifft, gibt es eine Explosion und ein Teil des Geländes verschwindet).

Derzeit verwende ich eine Textur mit einem zunehmend höheren Rotwert, wenn sie sich der Mitte nähert. Ich gehe jedes Pixel dieser "Deform" -Textur durch. Wenn das aktuelle Pixel ein Geländepixel überlappt und einen ausreichend hohen Rotwert aufweist, ändere ich das Farbarray, das das Gelände darstellt, auf transparent. Wenn das aktuelle Pixel NICHT einen ausreichend hohen Rotwert hat, schwärze ich die Geländefarbe (sie wird schwärzer, je näher der Rotwert am Schwellenwert liegt). Am Ende dieses Vorgangs verwende ich SetData, um meine Geländetextur zu aktualisieren.

Mir ist klar, dass dies kein guter Weg ist, nicht nur, weil ich über Pipeline-Stände und dergleichen gelesen habe, sondern auch, weil es ziemlich verzögert werden kann, wenn viele Krater gleichzeitig hinzugefügt werden. Ich möchte meine Kratergenerierung auf der GPU neu erstellen, anstatt Render Targets "Ping-Ponging" zwischen dem Ziel und der zu ändernden Textur zu verwenden. Das ist nicht das Problem, ich weiß, wie das geht. Das Problem ist, dass ich nicht weiß, wie ich meinen Brenneffekt mit dieser Methode beibehalten kann.

So sieht der Brenneffekt jetzt aus:

Brenneffekt

Hat jemand eine Idee, wie ich einen ähnlichen Brenneffekt erzeugen würde (Verdunkeln der Ränder um den gebildeten Krater)? Ich bin mit Shaders völlig unbekannt, aber wenn es erforderlich ist, wäre ich wirklich dankbar, wenn mich jemand durch die Vorgehensweise führen würde. Wenn es andere Möglichkeiten gibt, wäre das auch großartig.

Benixo
quelle
Dies könnte helfen: gamedev.stackexchange.com/q/6721/1163
Adam Harte

Antworten:

7

Eine Möglichkeit, dies zu tun, ähnelt der, die Sie getan haben. Haben Sie eine "Damage" -Textur und die tatsächliche Hintergrundtextur, aber anstatt die Daten jedes Mal zu kopieren, behalten Sie die beiden einfach als zwei separate Texturen bei.

Zeichnen Sie bei einer Explosion einen Kreis auf die Schadenstextur mit einer leicht transparenten Kante. Dies ist der "Brenn" -Bereich.

Wenn Sie das Gelände zeichnen, geben Sie der GPU beide Texturen und lassen Sie Ihren Shader die Farbe (.rgb) der Hintergrundpixel mit 1 multiplizieren - dem Alpha-Wert der Schadenstextur. Entfernen Sie die vollständig schwarzen Pixel (Alpha sie auf 0, oder Sie können diese auch mit Alpha multiplizieren (.rgba anstelle von .rgb), je nachdem, ob Sie durchscheinende verbrannte Bereiche möchten) und voila!

Ich bezweifle, dass dies die beste Lösung ist, aber es ist ziemlich ähnlich zu dem, was Sie zuvor getan haben, was die Übertragung erleichtern könnte. Sie könnten wahrscheinlich auch davonkommen, ein Array von Vector3s (x, y, Radius) zu übergeben und im Shader basierend auf diesen Explosionspunkten etwas zu rechnen, aber ich bin mir nicht sicher, wie effizient solche sind.

Hoffe das hilft!

Lunin
quelle
Vielen Dank! Das ist auch eine coole Art, und ähnlich wie ich es jetzt mache, wie Sie sagten. Ich weiß nichts über HLSL, aber ich werde es auf jeden Fall untersuchen. Mir wurde auch gesagt, ich könnte es schwärzen, wenn ich mich dem Rand des Kraters nähere, aber ich werde es auch so versuchen.
Benixo