Schatten an der Wand

Sie sind ein dunkler, aber dennoch extrem wichtiger Bestandteil in 3D-Szenen: Schatten. Schatten ermöglichen es uns Abstände in der flachen Darstellung von 3D-Szenen auf Monitoren abzuschätzen und verleihen einer Szene Realismus und Tiefe. Der Schatten allein kann dabei den Unterschied zwischen einer langweiligen und interessanten Szene ausmachen.

Zur Erzeugung von Schatten gibt es eine ganze Menge Verfahren, die teilweise sehr einfach sind und teilweise brutal kompliziert. Einige dieser Algorithmen erzeugen einfache Schatten und andere erzeugen detaillierte. Allen gemein ist dabei, daß es nicht DEN Algorithmus zur Erzeugung eines Schatten gibt. Jeder hat Vor- und auch Nachteile.

Aktuell interessieren mich insbesondere Schatten auf dem Windows Phone. Ich kann diese gebrauchen um das ein oder andere Projekt etwas aufzupeppen, doch es gibt ein paar Einschränkungen. Zum einen ist die Grafikkarte in einem Smartphone deutlich leistungsschwächer als in der XBox oder einem PC und zum anderen können wir momentan leider noch keine Custom-Shader für das Windows Phone entwickeln. Wir sind auf ein paar vorgegebene Shader angewiesen. Glücklicherweise können wir trotzdem den ein oder anderen Algorithmus nutzen, auch wenn die Auswahl kleiner wird.

Zur Evaluierung dieser Algorithmen entwickele ich derzeit kleine Testprogramme mit denen ich ein wenig spielen kann. Ich kann die Geschwindigkeit messen und die Vor- und Nachteile ausloten. Auch die visuelle Qualität kann ich so gut beurteilen. Meine Auswahl ist auf drei oder vier Algorithmen geschrumpft und für zwei habe ich bereits Beispielanwendungen entwickelt. Ich habe mich übrigens dazu entschlossen – da ein solches Beispiel bereits die halbe Miete ist – für jeden dieser Algorithmen ein Tutorial zu schreiben, welche ich in den nächsten Wochen auf indiedev.de veröffentlichen werde.

Die ersten beiden Varianten sind projizierte Schatten, welche schnell und detailreich sind, aber den Nachteil haben, dass sie nur auf eine einzige, falche Plane projiziert werden können. Hier das zugehörige Teaser-Video:

Schön bei dieser Art der Schatten ist, dass die Komplexität des schattenwerfenden Objektes nicht so stark ins Gewicht fällt.

Die zweite Art von Schatten sind die Schattenvolumen, welche sicherlich noch aus Doom 3 bekannt sein dürften. Diese bügeln ein paar der Nachteile aus, die bei den projizierten Schatten existieren: Sie können auf beliebige Geometrien geworfen werden und ermöglichen sogar die Selbstschattierung des schattenwerfenden Objekts. Der Nachteil ist jedoch, dass die Schattenvolumen realtiv teuer in der Erzeugung sind und das Ganze deutlich an der Füllrate knabbert. Für einfache Szenen aber eine sehr gute Möglichkeit.

Auch hier habe ich ein kleines Teaser-Video aufgenommen:

Dabei ist noch nicht das endgültige Ergebnis sichtbar, sondern der interessantere Zwischenschritt. Rot habe ich dabei die Silhouette des schattenwerfenden Objektes aus Sicht der Lichtquelle markiert. Diese wird vollkommen dynamisch berechnet und funktioniert auch problemlos mit komplexeren Objekten, wie dem aus dem ersten Video. Ich habe hier jedoch einen einfachen Würfel genommen, damit man besser das Ergebnis erkennen kann. Die gelben Linien sind die Kanten des Schattenvolumens, welches aus der Silhouette dynamisch erzeugt wird. Mit diesem Volumen kann dann mit ein paar Stencil-Buffer-Tricks der eigentliche Schatten gerendert werden.

Ich hoffe jedenfalls, daß ich diese interessanten und optisch durchaus gelungenen Techniken mal in einem Spiel einsetzen kann und ich hoffe, daß auch ihr Interesse an weiteren Informationen zu diesem Thema zeigt. Ich denke, daß der ein oder andere sicherlich ein Tutorial gut gebrauchen kann um mehr über Schatten auf dem Windows Phone zu erfahren. Bald ist es soweit, schaut einfach hin und wieder mal auf indiedev.de vorbei, denn dort werden nicht nur diese Artikel veröffentlich sondern auch eine ganze Menge anderer interessanter Dinge.

Advertisements

Veröffentlicht am 12.04.2012 in Windows Phone, XNA, XNA 4.0 und mit , , , , getaggt. Setze ein Lesezeichen auf den Permalink. 3 Kommentare.

  1. Die erste Variante sollte relativ einfach sein (Matrix.CreateShadow), aber insbesondere auf eine konkrete implementierung der 2.ten Variante bin ich sehr gespannt!

    • Ja, die erste Variante ist tatsächlich relativ einfach. Schwierigkeit daran ist hauptsächlich das Render der Schatten (ich mache es per Stencil-Buffer und Alpha-Blending) und die Skalierung. Ist aber noch relativ gut beherrschbar. Bei der zweiten Variante ist die Generierung des Schatten-Volumens nicht ganz trivial und das Rendern mittels Stencil-Buffer und ebenfalls Alpha-Blending (aber eine etwas andere Vorgehensweise als bei Variante eins).

      Ich dachte eigentlich schon, daß ich den Demo-Code fertig hätte, aber in Variante zwei ist noch ein kapitaler Fehler enthalten, den ich noch nicht genau lokalisiert habe. Irgendwas ist im Algorithmus zur Erzeugung der Schatten-Volumen falsch, weshalb es zu Problemen bei einigen Geometrien kommt. Ich hoffe aber, daß ich den Fehler bald finde und mich dann an die Tutorials machen kann.

      • Ich habe gestern ein wenig mit der ersten Variante herumgespielt, ist eigentlich wirklich ganz einfach. Um das Problem mit der Ebenenbeschränkung etwas zu mindern generiere ich die Ebene einfach einmal pro Frame mithilfe eines Raycasts vom Objekt auf den Boden, so ist der Schatten mehr oder weniger korrekt solange die „beschattete“ Fläche mehr oder weniger eben ist. Nur beim rendering muss ich wohl nochmals mit dem Stencil-Buffer drüber:-P

        Gibt es vielleicht irgendwo ein nettes kleines Tutorial wie ich eine Projektion hinbekommen könnte, z.B für Schatten oder auch einfach nur das Spot Light einer Taschenlampe…

        PS: Super Blog hier, danke!

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: