Verwendung des Effekts für den Nebel des Krieges

9

Ich versuche, den Nebel des Krieges auf Bereiche auf dem Bildschirm anzuwenden, die für den Spieler momentan nicht sichtbar sind. Ich mache das, indem ich den Spielinhalt in ein RenderTarget und den Nebel des Krieges in ein anderes rendere, und dann füge ich sie mit einer Effektdatei zusammen, die die Farbe aus dem Spiel RenderTarget und dem Alpha aus dem Nebel des Krieges rendert Ziel. Der FOW RenderTarget ist schwarz, wo der FOW erscheint, und weiß, wo es nicht ist.

Das funktioniert, aber es färbt den Nebel des Krieges (die nicht offenbarten Orte) weiß statt der beabsichtigten Farbe von Schwarz.

Vor dem Anwenden des Effekts lösche ich den Backbuffer des Geräts auf Weiß. Wenn ich versuche, es zu schwarz zu machen, erscheint überhaupt nichts von dem Nebel des Krieges, von dem ich annehme, dass es ein Produkt von Alpha-Mischen mit Schwarz ist. Es funktioniert jedoch auch für alle anderen Farben und gibt dem resultierenden Bildschirm einen Farbton dieser Farbe.

Wie kann ich einen schwarzen Nebel erzeugen und trotzdem Alpha-Blending zwischen den beiden Render-Zielen durchführen?

Der Rendercode für die Anwendung des FOW:

%Vor%

Die Effektdatei, die ich verwende, um den FOW anzuwenden:

%Vor%     
Kasper Holdum 18.05.2010, 01:11
quelle

2 Antworten

3

Ich habe XNA nicht zu sehr ins Auge gefasst und kann es im Moment nicht einrichten, um es mit dem CTP von 4.0 zu überprüfen, aber beim Lesen der Dokumentation sieht es so aus, als würden Sie sich verdoppeln. Soweit ich weiß, bewirkt BlendState.AlphaBlend , dass die SpriteBatch Alpha jedes Sprite, das gezeichnet wird, miteinander vermischt.

Laut Dokumentation Es verwendet die Standardeinstellungen von

%Vor%

Was sollte die folgende Auswirkungen :

  

Eins : Jede Komponente der Farbe wird mit (1, 1, 1, 1) multipliziert.

     

InverseSourceAlpha : Jede Komponente von   Die Farbe wird mit der Umkehrung multipliziert   des Alpha-Wertes der Quelle. Dies   kann dargestellt werden als (1 - As, 1 - As,   1 - As, 1 - As), wobei As das Alpha ist   Zielwert.

Wenn Sie also Blend.AlphaBlend verwenden, sollten Sie in der Lage sein, Ihren Back-Buffer auf Schwarz zu setzen und dann nur Ihre Map-Sprites zu rendern, wobei Sie das Alpha direkt dort absenken, wo es verblasst werden soll. Dies sollte einfach die Map-Pixel verblassen, wo sie von FOW "bedeckt" werden, was bewirkt, dass sie sich mit dem Schwarz des Backpuffers überlagern.

Wenn Sie den Shader-Ansatz verwenden möchten, können Sie den Shader zwischen zwei Renderzielen mit Alpha mischen. Ich bin ein bisschen verwirrt von Ihrer Erklärung, wie genau Sie eigentlich verschmelzen wollen. Sie sagen, Sie möchten Alpha-Blending, aber das Render-Ziel von FOW ist schwarz, wo es Nebel gibt und weiß, wo nicht. Wenn Sie Alpha verwenden, um die Überblendung zu steuern, sollte die Nebelfarbe über das gesamte Renderziel gleichmäßig (oder entsprechend strukturiert) sein, je nachdem, welche Darstellung gewünscht wird. Angenommen, Sie möchten schwarzen Nebel, Ihre Farben sollten (0, 0, 0) über das gesamte Renderziel hinweg sein, und der Alpha-Wert sollte sich ändern, je nachdem, wo Sie ihn anzeigen möchten.

Mit diesem Ansatz können Sie Ihren Shader in etwa wie folgt ändern:

%Vor%

Ich habe schon lange keine HLSL-Shader mehr gemacht, aber ich bin mir sicher, dass das viel einfacher geschrieben werden kann. Wie auch immer, wenn FOW schwarz ist (und der Hintergrundpuffer schwarz ist und Sie nicht mehrere Alpha-Blended-Sprites übereinander stapeln - siehe Joels Antwort), unterscheidet sich dieser Ansatz nicht von der direkten Einstellung des Alpha des map Sprite basierend darauf, ob es FOW gibt oder nicht.

    
jeffora 18.05.2010, 13:33
quelle
1

Es scheint, als ob Sie in die Situation geraten, die Shawn Hargreaves in diesem Blogpost beschrieben hat:
Vorgemischte Alpha- und Bildkomposition

Versuchen Sie, zu vorvervielfachtem Alpha zu wechseln, wie er es vorschlägt und lassen Sie uns das Ergebnis wissen: -)

    
Joel Martinez 18.05.2010 13:02
quelle

Tags und Links