Beides ist völlig richtig, für ShadowVolumes gibt es gar kein Lichtfrustum, da sie einfach die Silhouettenvertices in Richtung des Lichteinfalls extrudiert werden. Es ist z.B. überhaupt kein Problem, eine Lichtquelle im Inneren eines Objektes aufzustellen und die Schatten werden draußen richtig dargestellt.
Weiche Schatten lassen sich - ich geb's zu - überhaupt nicht darstellen. Die Möglichkeit die NVidia vorschlägt, nämlich die Lichtquelle ein venig zu variieren und die Variationen überzublenden ist erstens langsam und zweitens schauen die so erhaltenen streifigen Stencil Shadows ja noch schlimmer aus, als die "normalen" scharfkantigen.
Wer scharfe Schatten überhaupt nicht mag, kann einfach AntiAliasing aktivieren, dann sind die Übergänge auch weicher und es schaut IMHO besser aus als die NVidia Lösung.
Dein Angebot mir deine ShadowMap-Klasse zur Verfügung zu stellen ist sehr freundlich - leider unterstützt meine Radeon 9000 die Depth Texture Extension nicht. Außerdem kenne ich meine Grenzen, wenn ich jetzt auch noch anfange alle ARB-Erweiterungen in Mcad einzubauen, wächst mir das Ganze wahrscheinlich über den Kopf :blink: . Nein nein, ich widerstehe des Teufels Advokaten (oder eher Cthulhus ?) und bleibe bei meiner Standardimplementation, die leichter zu verwalten ist und garantiert überall läuft (aber danke für das Angebot).
Interessante Demos. Beide Techniken haben eben ihre vor und Nachteile. Ich möchte noch was ergänzen:
Das Problem bei Shadowmaps sind Punktlichter. Da reicht dann ja einmal zeichnen nicht aus. Hier könnten unter Umständen Schatten Volumen schneller sein. Außerdem kommt es ab einer gewissen Entferung bei Shadowmaps zur Blockbildung. Vom Prinzip her sind Shadowmaps besser, aber ich denke es immer auf die jeweilige Szene ankommt, welche Art von Schatten bessere Ergebnisse liefert. Ein großer Vorteil ist auf jeden Fall, daß man einfach die Geometrie wie bisher zeichnen kann und dadurch nicht in der Anzahl der Dreiecke eingeschränkt ist. Außerdem muß man die Shadow map nur neu generieren, wenn sich die Lichtquelle bewegt hat. Eine weitere Idee wäre pro Licht zwei Shadowmaps zu nehmen eine statische für die statischen Objekte und eine für die bewegten Objekte. Dann muß mal eben beim Vergleichen bei Shadowmaps vergleichen. Stencil Schatten kann man auch durch ein Vertex Program extruieren. Dafür muß das Objekt dann aber geschlossen sein.
Eigentlich ist es kein Problem auch bei komplexen Geometriedaten ShadowVolumes zu verwenden - es zwingt einen ja niemand, das Mesh des schattenwerfenden Objektes ebenso komplex zu machen, wie das Dargestellte (muss man sich nur mal die Charakterschatten bei Morrowind ganz genau ansehen ). Mcad löst dies übrigens, indem ein Objekt optional zusätzlich zum OpenGL Code noch ein Trianglemesh mitverwaltet. Das hat den Vorteil, dass man zum Zeichnen optimierte Quad- und Trianglestrips in eine Displayliste kompilieren kann, das Mesh ist dann nur für Schattenwurf und Kollisionserkennung zuständig, und kann dementsprechend in der Komplexität vermindert werden - das Demo verwendet übrigens keine vereinfachte Schattengeometrie (wäre bei den paar Miniobjekten ohnehin sinnlos).
Von der Möglichkeit Stencilshadows über Vertexprogramme zu extrudieren würde ich übrigens abraten - hier wird nämlich, soweit ich weiß (lasse mich aber gern eines Besseren belehren) wirklich jedes Polygon extrudiert, was den potentiellen Geschwindigkeitsvorteil der Grafikhardware ganz schnell zunichte macht, da es ja ausreicht ein ShadowVolume über die Silhouette zu erstellen (im Schnitt wächst die Anzahl der Flächen relativ zum Quadrat der Anzahl der Silhouettekanten).
Was verwendet wird, muss sich schlussendlich wirklich jeder selbst überlegen. Wenn man nicht gerade völlig abgehobene Beleuchtungseffekte haben möchte, sind ShadowMaps auf unterstützter Hardware sicher auf jeden Fall schneller UND einfacher zu implementieren. Für mich sind ShadowVolumes angenehmer, da ich die Meshes der einzelnen Objekte ja ohnehin für den letzten und exakten Schritt der Kollisionserkennung benötige - und eben auch keine Extensions verwenden möchte.
Eine Frage hätte ich noch: Wie ist denn das mit ShadowMaps, wenn ich mehrere animierte Lichtquellen haben möchte, benötige ich dann für jede Lichtquelle eine eigene Textureinheit, oder gibt es eine Möglichkeit mehrere Lichtquellen in einer Textur vorzuberechnen ?
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Zitat:
Eine Frage hätte ich noch: Wie ist denn das mit ShadowMaps, wenn ich mehrere animierte Lichtquellen haben möchte, benötige ich dann für jede Lichtquelle eine eigene Textureinheit, oder gibt es eine Möglichkeit mehrere Lichtquellen in einer Textur vorzuberechnen ?
Ich hab mich zwar noch nicht eingehend mit dieser Thematik befasst (das von mir in diesem Thread gepostete Demo war meine erste Erfahrung in Sachen Shadowmaps), allerdings dürfte es kein Problem sein, mehrere Lichtquellen in eine Textur hineinzuzwengen.Wie groß der Aufwand dabei ist, weiss ich nicht, bin aber dabei (oder besser gesagt : ich versuche) sowas zu implementieren. Sollte dies nicht möglich sein, so hast du recht, man braucht für jede Schattentextur eine eigene Textureneineit.Das wird dann wirklich knapp, denn eine Textureneinheit geht ja (mindestens) für die Geometrie drauf, und dann noch für jede Lichtquelle eine eigene Textureneinheit.Bei zwei bis drei Lichtquellen ist dann selbst bei modernen 3D-Beschleunigern (die GeForceFX 5200/5600 hat z.B. "nur" 4 TMUs) ists dann vorbei mit dem Singlepass...
allerdings dürfte es kein Problem sein, mehrere Lichtquellen in eine Textur hineinzuzwengen.Wie groß der Aufwand dabei ist, weiss ich nicht, bin aber dabei (oder besser gesagt : ich versuche) sowas zu implementieren.
Wäre nett, wenn du das Ergebnis dann hier posten könntest (auch wenn's nicht klappen sollte).
@Mars: Ja, obwohl es möglich ist, sollte man Vertex Programme nur für die eigentlich Extrusion der Punkte nutzen und die Silhoutte auf der CPU berechnen. Wenn man Schattenvolumen vollställdig mit einem Program berechnen möchte muß man an den Kanten Dreicke einfügen, die dann beim Extruieren die Seitenflächen des Schattenvolumes darstellen. Das ist zu langsam, weil für jede Kante dann 2 Dreiecke eingefügt werden müßen.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Ich war grad mal wieder am rumexperimentieren, und da ist mir schlagartig die Idee gekommen doch nen netten Drahtzaun einzubauen, der mittels Alphamasking einen verdammt gut aussehnden Schatten auf die Szenerie wirft.
Das ist in meinen Augen auch ein riesiger Vorteil des ShadowMappings, nämlich die Tatsache das man filigrane Schatten ganz einfach mittels der Alphamaske einer Textur erzeugen kann.Mit ShadowVolumes dürfte dies wohl kaum, oder nur unter sehr sehr großem Auwand möglich sein.
Um das was ich angesprochen habe zu verdeutlichen, gibts hier wieder (weils so geil aussieht ) ein paar Screenshots (Klicken um zu Vergrößern) :
Registriert: So Jan 26, 2003 15:57 Beiträge: 50 Wohnort: Hamminkeln
Hm, stimmt schon, es ist wirklich detailgetreu, aber andererseits sieht man an deinem Beispiel auch ziemlich gut den großen Nachteil von ShadowMaps, die Schatten werden immer gröber, je weiter sie von der LQ entfernt sind, was natürlich wieder unschön ist. Nichts desto trotz, deine Demo find ich wirklich gut! Ein großes Lob an dich!
mfg, Dennis.
_________________ Bush's on a highway to hell with the whole world blind, leading it straight into the flames.
Registriert: Sa Okt 26, 2002 17:14 Beiträge: 188 Wohnort: Hannover/Lüneburg
Hm, müssen die Schatten nicht auch größer werden, wenn sie weiter weg sind? Außer natürlich das Licht fällt parallel ein, wie etwa Sonnenlicht. Aber bei Point und Spot-Lights sollte es so doch richtig sein, oder täusche ich mich da jetzt?
_________________ Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?
Registriert: So Dez 29, 2002 10:37 Beiträge: 251 Wohnort: Ulm
nein thunder, da hast du recht
was mir auffällt, was kein pc spiel oder grafik programm wirklich richtig macht (außer natürlich die raytracer ...): ein licht ist im realen leben nie EIN punkt, wodurch es dazu kommt, dass man fast nie einen richtigen schatten hat, bei dem man jede einzelne kante sieht. das ist größtenteils nur so ein "weichgezeichneter" umriss vom körper!
ich finds nur schade, dass das auf meiner geforce ddr nicht funktioniert
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Thunderman hat geschrieben:
Hm, müssen die Schatten nicht auch größer werden, wenn sie weiter weg sind? Außer natürlich das Licht fällt parallel ein, wie etwa Sonnenlicht. Aber bei Point und Spot-Lights sollte es so doch richtig sein, oder täusche ich mich da jetzt?
Doch, und das werden sie auch...zieh dir mal die Demo (vorausgesetzt das deine Grafikkarte die entsprechende GL_ARB_DEPTH_TEXTURE-Extension unterstützt), und entfern dich mit der Lichtquelle mal von den Objekten und vice versa.Dann wirst du sehr gut sehen können, das die Schatten mit größerer Entfernung länger werden, so wie das im realen Leben der Fall ist.
rochus hat geschrieben:
was mir auffällt, was kein pc spiel oder grafik programm wirklich richtig macht (außer natürlich die raytracer ...): ein licht ist im realen leben nie EIN punkt, wodurch es dazu kommt, dass man fast nie einen richtigen schatten hat, bei dem man jede einzelne kante sieht. das ist größtenteils nur so ein "weichgezeichneter" umriss vom körper!
Das stimmt.Allerdings kann man da mittels ShadowMapping so einiges machen, da man ja seine Schattentextur hat, die man nachdem sie erstellt wurde, nach Belieben manipulieren, und an den Rändern bzw. nach hinten hin weichzeichnen kann.In SplinterCell (neue Unreal-Engine) gibts ähnliche Effekte.
@SoS Also so ein Maschendrahtzaun wäre über ShadowVolumes nur sehr schwierig (also eher gar nicht :rolleyes: ) zu realisieren (halt nur über Unmengen an Geometrie)
@rochus Dann musst du dich halt an die StencilShadows halten, die funktionieren auf jeder Hardware (und sogar im Softwaremodus) einwandfrei
Registriert: Sa Okt 26, 2002 17:14 Beiträge: 188 Wohnort: Hannover/Lüneburg
SoS: Hab mich ja nur auf rochus Posting bezogen. Mir war schon klar, und ihm ja wohl auch, dass ShadowMapping genau das ja tut. Hab allerdings "nur" ne Radeon 8500 und die hat die Extension meine ich nicht...
_________________ Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Da ich grad dabei bein mit meiner neuen Hercules 9700 zu spielen, hab ich auch folgende Extension entdeckt, die neben der 9500Pro nur noch die 9700 bzw. 9800 (zumindest im Desktop-Bereich) unterstützen : <a href='http://oss.sgi.com/projects/ogl-sample/registry/ARB/shadow_ambient.txt' target='_blank'>GL_ARB_Shadow_Ambient</a>
Mittels dieser netten Extension, die übrigens gleich mit der GL_SHADOW_AMBIENT_SGIX-Extension ist (also auch die gleiche ID besitzt), wird es möglich den Texturenwert zu setzen, der im Falle eines Fehlschlagens des Vergleichstestes gesetzt wird.Im Normalfall ist das ja 0, sprich alles im Schatten ist komplett schwarz.Mittels dieser Extension kann man aber ganz einfach den Wert der in diesem Falle gesetzt werden soll festlegen, so daß man die Schatten im Handumdrehen mehr oder weniger transparent machen kann.Man benötigt dann also nur noch eine Textureinheit statt wie bisher zwei um transparente Schatten darzustellen.
Hier mal ein Screenshot :
Die aktualisierte Demo hab ich noch nicht hochgeladen, wer allerdings ne 9500,9700 oder gar 9800er Radeon besitzt, kann diese Funktion ganz einfach nutzen indem er dort wo die Shattentextur erstellt wird folgende Zeile einfügt : <!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre>glTexParameterf(GL_TEXTURE_2D, GL_SHADOW_AMBIENT_SGIX, <span class='integer'>0.6</span>); // neue Zeile, der Param-Wert gibt die Transparenz des Schattens an // Folgendes sollte dort bereits stehen glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE_ARB, GL_LUMINANCE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL);</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->
Mitglieder in diesem Forum: Google [Bot] und 2 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.