Einheit: Wenden Sie einen Bildeffekt nur auf eine Ebene an

8

Bitte betrachten Sie diese einfache Szene.

Geben Sie hier die Bildbeschreibung ein

Es besteht aus 3 verschiedenen Spielobjekten. 1 Hintergrundbild + 1 statisches Zeichenbild + 1 kleiner Teil (mit dem Haustier), der zur Laufzeit geändert wird, um eine Animation auszuführen.

Geben Sie hier die Bildbeschreibung ein

Der Hintergrund wird mit einer speziellen Kamera gerendert. Der Charakter (statisch + animiert) wird mit einer anderen speziellen Kamera gerendert. Beide Kameras sind mit einer anderen Keulungsmaske auf Nur Tiefe eingestellt (jede Kamera rendert nur ihren Teil). Beachten Sie, dass die Kamera, die für den Charakter verantwortlich ist, eine größere Tiefe hat als die Kamera, die für den Hintergrund verantwortlich ist (dh der Charakter wird nach dem Hintergrund gerendert).

Ich muss einen Bildeffekt nur auf die Charakterkamera anwenden, aber ich kann keinen Weg finden, wie dieser Effekt den Hintergrund nicht beeinflusst.

Beispiel hier mit einem Vortex-Effekt auf die Charakterkamera.

Geben Sie hier die Bildbeschreibung ein

Wie würdest du so einen Trick machen?

lvictorino
quelle

Antworten:

8

Das Problem ist, dass der Bildeffekt nach dem Rendern den aktuellen Bildschirm erfasst.

Da Ihre Kamera direkt in den Backbuffer rendert (sie löschen nur die Tiefe), gilt der Bildeffekt für alles.

Lösung kann sein:

  • Richten Sie zuerst eine Kamera ein, die eine transparente Farbe aufweist, mit einem RenderTarget-Setup (Sie können es per Skript erstellen, damit es die gleiche Größe wie Ihr Bildschirm hat) und dem gewünschten Nachprozess.
  • Richten Sie eine Kamera-Sekunde ein, die Ihren Hintergrund rendert und die Hintergrundfarbe / Skybox klar macht
  • Richten Sie eine dritte Kamera ein, die nichts rendert (Culling-Maske auf Nothing gesetzt), nichts löschen und das Skript AlphaBlit.cs anhängen. AlphaBlit benötigt zwei Informationen: ein Material, das den AlphaBlit.shader und das Rendertarget zum Mischen verwendet (Sie müssen es per Skript zuweisen, wenn Sie es im ersten Schritt per Skript erstellt haben).
  • Richten Sie eine vierte Kamera ein, die Ihren Vorwärtscharakter rendert.

VORSICHT: Dies ist ein Malalgorithmus. Dies bedeutet, dass alles, was die dritte Kamera rendert, zusätzlich zu dem, was bereits vorhanden ist, und die vierte Kamera darüber gerendert wird.

Ich bin mir nicht sicher, ob es einen Weg gibt, es besser zu machen, da es erforderlich wäre, auch den Tiefenpuffer zu verzerren, was nicht möglich ist ... (nicht ohne direktes Rendern mit einem Wirbeleffekt, der schwieriger ist) ...

Die optimiertere Methode wäre natürlich, den Nachprozess nicht auf die erste Kamera anzuwenden, sondern sie nur in einem Rendertarget zu rendern und den AlphaBlit.shader so zu ändern, dass der Wirbeleffekt erzielt wird, während das RenderTarget gelöscht wird. Aber das ist komplexer.

Sirithang
quelle
Danke für deine Antwort. Ich habe einige Probleme mit "Rendern einer Kamera mit einem Skript, das im OnRenderImage einfach einen Blit dieses RenderTargets in das Ziel-Rendering-Ziel (dh den Backbuffer hier) ausführt". .. denn selbst wenn die Farbe transparent schwarz ist, ist alles schwarz einmal blit.
lvictorino
bearbeitete Antwort mit mehr Präzision
Sirithang
Der grundlegende Lösungsworkflow ist in Ordnung, aber ich habe hier ein unerwartetes Problem mit Alpha. Eigentlich möchte ich Vordergrundpegel verwischen. Diese Lösung funktioniert, sieht aber irgendwie verkabelt aus. puu.sh/C6sSB/ca5d5162b0.jpg Wenn ich die Farbe der klaren Flaggen in Magenta mit 0 Transparenz ändere, hat es an den Seiten einen seltsamen Magenta-Umriss (sollte nur transparent sein). puu.sh/C6sSB/ca5d5162b0.jpg . Dadurch funktioniert die gesamte Lösung bei mir nicht. Ich bin mir nicht sicher, warum das passiert. Das Wechseln der Clear-Flags hilft nicht.
AvrDragon