Echtzeit-Schattenwurf in einem isometrischen 2D-Spiel

15

Ich schreibe eine kleine isometrische 2D-Engine in C ++ und versuche, Echtzeit-Schattenwurf zu implementieren. Ich bin einem einfachen Ansatz gefolgt, der auf dieser Seite beschrieben wird, und hier ist das Ergebnis (das Licht befindet sich an derselben Position wie der gelbe Würfel):

Bildbeschreibung hier eingeben

Das Ergebnis ist sehr schön, aber es fehlen Schatten an den Wänden und auf den Würfeln. Hier ist ein Beispiel, wie es aussehen sollte (ich habe erwartete Schatten in Grün gezeichnet):

Bildbeschreibung hier eingeben

Alle gezeichneten Würfel bestehen einfach aus 3 2D-Quadern an einer XY-Position und mit einer Z-Tiefe (z = x + y). Ich benutze OpenGL mit einer orthographischen Matrix (glOrtho). Schatten werden mit dem Schablonenpuffer gezeichnet.

Ich bin auf der Suche nach Ressourcen oder Lösungen, die mir helfen, diese Implementierung des Schattenwurfs abzuschließen.

Danke vielmals!

XPac27
quelle
5
Ihr Link zu "dieser Seite" verweist auf ein Bild und nicht auf eine Seite. Ich rate hier nur, aber es könnte einfacher sein, dieses Problem in 3D zu lösen und die Kamera nur iosmetrisch zu projizieren.
Tetrad
Ups, du hast recht, ich habe den Link repariert. Mit einer 3D-Projektion wäre es sicherlich einfacher, aber 2D hat auch seine Vorteile, und ich bin sicher, dass es Lösungen gibt, um dies in 2D umzusetzen.
XPac27

Antworten:

6

Bei Dach und Wänden können Sie versuchen, Schnittpunkte zwischen Ihren Wandsegmenten und den erzeugten Schattenbereichen zu bestimmen. Sie benötigen ein Rendering Ihrer Schatten in zwei Durchgängen. Zuerst macht man das, was man heute macht (im Speicher). Der zweite Durchgang berechnet die Schnittpunkte von Dach und Wand. Letzte Stufe ist echtes Rendern. DeadMG ist falsch, das können Sie tun.

Hinweis: Für das Dach müssen Sie den Schattenbereich und den Dachbereich schneiden.

sgc
quelle
Vielen Dank für den guten Rat! Ist möglicherweise in der Lage, diesen zweiten Durchgang zu optimieren, indem überprüft wird, welche Wände unter Verwendung des Punktprodukts ihres Segments im Vergleich zu den Schattensegmenten berechnet werden sollen. Ich werde das versuchen und zurückschicken, wenn es funktioniert.
XPac27
Es ist schon eine Weile her, aber dank Ihrer Vorschläge konnte ich es endlich zum Laufen bringen! Ich brauchte nur zwei Geometriemethoden (eine, um zu wissen, ob sich ein Punkt innerhalb eines Polygons befindet, und eine, um den Schnittpunkt zweier Segmente zu ermitteln). Ich muss noch mit Dächern umgehen, aber es sieht einfach aus, es zu wissen. Sie können das Ergebnis in diesem Video sehen und den Quellcode hier ansehen (ich habe gerade einen Tag daran gearbeitet, damit es möglich sein kann, es weiter zu optimieren).
XPac27
@ XPac27 das ist der Wahnsinn. Danke für das Teilen.
Asche999
0

Grundsätzlich kann nicht getan werden, wonach Sie suchen. Sie möchten eine Reihe von 2D-Objekten aufnehmen und Schatten werfen lassen, als wären sie 3D-Objekte. Wenn Sie vollständige 3D-Schatten erhalten möchten, benötigen Sie 3D-Objekte.

DeadMG
quelle
1
Aber das ist kein 3D-Schattenwurf wie in der Frage. Jede Wand blockiert die Sichtlinie in dieser Richtung vollständig. Sie können keine Objekte mit variabler Höhe haben.
Yuriks
0

Die beschriebene Lösung ist nicht vollständig 3D, da er keine vollständige 3D-Lösung benötigt. Es wird so aussehen, aber es ist nicht so. Die Erzeugung von Schattenwurf muss als Schnittmenge zwischen Volumen betrachtet werden. Was er braucht, ist weniger kompliziert. Denken Sie daran, (wenn Sie gekannt haben), Schicksale und Schicksale wie Rendering-Engine. Alle Bearbeitungen wurden in zwei Dimensionen durchgeführt.

sgc
quelle
0

Angesichts der Tatsache, dass Sie möchten, dass dieses Spiel klein ist, können Sie sagen, dass die aktuelle Schattenimplementierung gut genug ist?

Ich gebe zu, dass ich dies nicht in Aktion gesehen habe, das heißt, ich habe nicht gesehen, wie störend oder nicht störend die Schattenunvollkommenheiten sein werden, wenn dieses Spiel mit dynamischen Objekten und dynamischen Lichtquellen live läuft, aber nach Ihren Bildern zu urteilen. ' Ich bin sehr versucht zu sagen, dass es gut genug ist, und konzentriere mich jetzt darauf, das Spiel zu Ende zu bringen. Wenn die aktuelle Implementierung zufällig klein ist und schnell ausgeführt wird und das Beheben von Problemen, die Sie für problematisch halten, den Code groß und langsam macht, sollten Sie sich keine Gedanken über diese Schatten machen.

Ich weiß, ich weiß, dass es eine schlechte Praxis sein könnte, wenn man vorschlägt, das Problem nicht zu lösen. Trotzdem möchte ich ehrlich sagen, dass es wirklich gut ist, wenn Sie einen kleinen Footprint für Ihren Code wünschen.

IllvilJa
quelle