Wie implementiere ich 2D-Schatten, die zwischen Ebenen geworfen werden?

10

Wie kann ich 2D-Schatten implementieren, die von Objekten in einer anderen Ebene geworfen werden?

NICHT wie die dynamische Beleuchtung im bekannten Tutorial von Catalin Zima :

Geben Sie hier die Bildbeschreibung ein

Aber wie die Schatten der Rohre in diesem Video :

Geben Sie hier die Bildbeschreibung ein

Und wie der Schatten der Plattform und der Charakter in diesem Video :

Geben Sie hier die Bildbeschreibung ein

Ich möchte die gleiche Art von Beleuchtung in einer Szene mit vielen Ebenen und vielen Lichtern mit verschiedenen Farben verwenden.

Ich könnte mir vorstellen, dies zu tun, indem ich eine schwarze Kopie der Ebene über die Ebenen hinter dieser Ebene zeichne und sie an die Löcher in den Ebenen anpasse, auf die der Schatten geworfen wird. Ich hoffe jedoch, dass es dafür einen kostengünstigeren, auf Pixel-Shader basierenden Ansatz gibt.

Beere
quelle

Antworten:

1

Dies kann mit Maskierung erfolgen. Es gibt mehrere Möglichkeiten, dies zu tun.

Eine Möglichkeit wäre, eine Schattenversion von Vordergrundelementen zu rendern. Zeichne den Hintergrund. Zeichnen Sie dann die Vordergrundelemente leicht versetzt, je nachdem, wie sich die Beleuchtung bewegen soll, sodass Sie nur schwarze Farben ausgeben. Zeichnen Sie dann den Vordergrund normal.

Eine andere Möglichkeit wäre, den Vordergrund in einen Puffer zu rendern, ein bisschen mehr als Sie tatsächlich sehen würden. Dann machen Sie einen "zu schwarzen" Pass und vielleicht einen Unschärfepass. Rendern Sie nun die Ausgabe dieses Satzes von Durchläufen und dann den sichtbaren Abschnitt des Vordergrundpuffers.

Um mehrere Lichter in verschiedenen Winkeln zu unterstützen, können Sie den vorherigen Schritt einfach mehrmals ausführen oder alle in einem einzigen Puffer sammeln. Die Mathematik hängt davon ab, was Sie erreichen möchten. Eine erste Vermutung in diesem ersten Video ist jedoch, dass sie nur die Position des Lichts gegen die Position der Kamera (Mitte des sichtbaren Bereichs) und einnehmen Verwenden Sie dann diesen Vektor (skaliert), um zu bestimmen, wie die Schatten versetzt werden sollen. Etwas wie:

draw background
for each light intersecting viewing bounds:
  offset = light.position - camera.position
  offset *= SCALE FACTOR (0.25 maybe)
  draw shadow foreground at offset
draw foreground

Lichter, die "näher" an der Szene sind, haben einen kleineren Skalierungsfaktor. Wenn Sie mehrere Tiefen wollen, müssen Sie einige mathematische Dinge herausfinden, einfache geometrische Dinge.

Sean Middleditch
quelle
Ja, genau das habe ich mir ausgedacht. Ich wusste nicht, dass der richtige Begriff dafür Maskierung war. Aber ich hoffte, dass es vielleicht einen Algorithmus geben würde, der der Funktionsweise von Schattenvolumina im 3D-Raum ähnlicher ist.
Berry
Wenn Sie Schatten auf Oberflächen mit Löchern werfen, müssen Sie den residenten Schatten über die Ebene dahinter werfen. Auch das Arbeiten mit Transparenz wird etwas schwierig. Ich habe bereits an alle Lösungen für diese Probleme gedacht! Aber ich dachte, es wäre zu teuer, es in Echtzeit aufzutragen, besonders wenn es um viele Schichten (20) und viele Lichter (50) geht. Deshalb habe ich mir einen anderen Ansatz erhofft.
Berry