2D-Schatten, "Randfindung"s-Probleme



  • Hallo.

    Für meine 2D Engine will ich 2D Soft Shadows implementieren. Ich werde das tun, indem ich einfach Hard-Shadows erzeuge und an deren Ränder dann (für die Penumbra) eine "Softshadowtextur" klebe, die ich je nach länge des Schattens strecke.

    Ich habe vor die Hard-Shadows mittels eines geometrischen Verfahrens zu erzeugen, das im Prinzip so abläuft:

    -Rausfinden, welche Eckpunkte des schattenwerfenden Objekts am Ende den Schatten werfen

    - 2 Linien von der Lichtquelle (unterstütze nur Punktlichter) über die Ränderpunkte des schattenwerfenden Objekts zur dahinterliegenden Wand (bzw. bis zum Bildschirmrand, wenn dahinter keine Objekte mehr sind) ziehen.

    - Dann zwischen den 4 Punkten "Eckpunkt1 vom schattenwerfenden Objekt", "Eckpunkt2", "Schnittpunkt1 von Linie und dahinterliegender Wand / Bildschirmrand", "Schnittpunkt2 von Linie und dahinterliegender Wand" ein Polygon erzeugen.

    - Nun für alle Pixel auf dem Bildschirm prüfen, ob sich der jeweilige Pixel in diesem Polygon befindet ( = Schatten, also abdunkeln oder ganz schwarz machen, je nachdem) oder nicht ( = normal bleiben ) und dann eine Lightmap erzeugen. Das ganze mach ich natürlich in "Genauigkeitsschritten", je nachdem ob das ganze perfomant bleibt. Das heisst, ich prüfe nur jexen x-ten Pixel und schwärze einfach alle x-Pixel aussenrum. Ich ermittle die Kollision von Punkt-Polygon mittels der "Grade-Ungrade-Regel" beim schneiden einer Gerade mit nem Polygon.

    - Lightmap an Pixelshader übergeben und Pixel jeweils umfärben, da auch gemische aus farbigen Lichtern und Schatten etc. erzeugt werden soll.

    Probleme habe ich hier im Prinzip nur beim ersten Schritt, da ich keine Ahnung habe, wie ich die 2 Eckpunkte des schattenwerfenden Objekts finde, von dem aus der Schatten geworfen wird. Habt ihr da hilfe?



  • für die meisten anwendungen reicht wohl die annäherung, anzunehmen, dass jeweils die 2 eckpunkte, bei denen der winkel zwischen eckpunkt-lichtquelle und x-achse bzw x-achsen-parallele am größten bzw. am kleinsten ist, die schattenwerfenden eckpunkte sind (also wo sich im prinzip mit gezeichneten verbindungslinien das größte dreieck zwischen eckpunkt-eckpunkt-lichtquelle bildet).

    wie genau du das ausrechnest müsste ich jetzt überlegen, das machst du aber am besten selbst, will dir ja den spaß nicht verderben 🙂 (außerdem bin ich zu müde)

    übrigens bin ich mir jetzt grade nicht sicher, ob das wirklich nur eine annäherung ist... grob durchgedacht könnte das auch für alle möglichen fälle gelten.


Anmelden zum Antworten