habe die ProjectedShadows Demo von sulaco.co.za genommen um schatteneffekte mithilfe vom stencilbuffer zu machen.
Leider ist das sehr lahm. Die einzige optimierung die ich bis jetzt gemacht hab ist, sowenig teile, auf die die schatten gerendert werden, wie möglich zu rendern. geht zwar ganz gut, doch sobald 10 q3models in der gegend rumstehen und alle einen schatten werfen, geht meine GForce3 direkt runter auf 7 fps (normalerweise bei der engine so 100fps).
Vielleicht hat ja schon mal jemand von euch solche schatten gecoded und kann mir sagen wie ich die optimiere.
Bin grad viel zu müde um zu sehen ob ich genug infos gepostet hab, wenn ihr noch was code oder so dazu haben wollt dann poste ich das gerne!
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
An deiner Stelle würde ich erstmal die Sache mit den projezierten Stencilschatten ganz vergessen, denn die liegen ja nur auf einer Ebene und sehen daher nur in Spezialfällen (sprich schattierte Umgebung total flach) brauchbar aus. Für komplexe 3D-Umgebungen sind die daher nix.
Also solltest du dich schonmal (je nach dem was dir lieber ist) entweder mit Shadowmapping (über projezierte Tiefentextur) oder volumetrischen Stencilschatten beschäftigen. Erstere Methode ist an sich die einfachere, hat jedoch besonders bei geringer Größe der Shadowmap zumindest einen optischen Nachteil. Dafür brauchst du im Gegensatz zu volumetrischen Stencilschatten keine Kenntnisse über die umliegende Geometrie, denn Textureprojektion erledigt das für dich.
Volumetrische Stencilschatten sind zumindest in meinen Augen die Zukunft in Sachen realistische Schatten, sind aber besonders mathematisch mit nem Vorschlaghammer zu vergleichen, besonders da man auch Spezialfälle berücksichtigen muss (wenn sich z.B. die Kamera im Schattenvolumen befindet). Dazu nimmt man dann am besten Carmacks zFail-Technike, aber wie gesagt ist das sehr heftiges und fortgeschrittenes Zeug.
Und generell zur Schattenoptimierung : Auf jeden Fall brauchst du gutes Culling, so dass auch wirklich immer nur für das was sichtbar ist Schatten berechnet werden. Davon abgesehen gibts dann noch andere Techniken zur Optimierung, wie entfernungsabhängiger LOD, oder wie z.B. bei UT2004 ein Alphafade. Da wird der Schatten dann mit steigender Entfernung langsam über einen Alphawert ausgefaded, so dass sehr weit entfernte Objekte trotz Sichtbarkeit keine Schatten berechnet bekommen.
ShadowMaps scheinen vom Prinzip her die bessere Wahl zu sein, aber es gibt da selbst bei riesigen Auflösungen immer noch Fehler. Wenn man jeweils nur einzelne Modelle schattieren möchte, dann kann man durchaus ShadowMaps benutzen, aber um ein ganzes Level in der Art von Doom3 zu beleuchten reicht die Qualität nicht aus. Daher sind Stencil Schatten auch, wenn sie nicht ganz billig sind, wohl die bessere Wahl.
Auf http://www.delphi3d.net gibt es eine Demo mit Stencil Schatten und mit ShadowMaps. In diesem PDF von NVidia http://developer.nvidia.com/docs/IO/823 ... es.pdfsind die Optimierungsmöglichkeiten für Stencil Schatten zusammengefaßt.
Also in meiner (noch recht primitiven) Umgebung sehen die Schatten übertrieben realistisch aus ! Ich weiss natürlich nicht wie das sein wird, wenn ich das neue Mapformat benutzen werde.
Ich weiss nich genau was shadowmaps sind, aber was ich mir unter dem namen vorstelle ist, dass ein object von der position des lichtes aus gerendert wird und dann im normalen bild als schatten auf die welt projiziert wird. So was in der Art hatte ich schon vorher gehabt nur die projektion war nicht so toll.
Ich kenne die demo von delphi3d, aber bei dem quellcode bin ich doch leider umgefallen. Mit Schatten coden anzufangen und das aus einem Quellcode rauszulesen, der einfach riesig ist und nur zeug beinhaltet von dem ich noch nix verstehe, ist einfach zu schwer.
Das nVidia ding werd ich mir gleich mal zu gemüte führen.
Gibt es denn nicht irgentwo ein richtiges Tutorial (auf deutsch) das moderne Schatten in OpenGL behandelt ?
Bei ShadowMaps rendert man eigentlich die Entfernung in eine Texture und testet dann ob der Pixel näher als die Entfernung vom Licht aus gesehen dran ist. Man kann auch nur das Objekt schwarz auf weißen Hintergrund rendern und dann projizieren. Dann hat man aber keine Schatten innerhalb des Objektes. Das ist bei UT2003/UT2004 so gemacht, ist aber auch keine generelle Lösung.
Das Tutorial bei gamedev.net zu Stencil Schatten
http://www.gamedev.net/reference/articl ... le1990.asp ist eines der ausführlichsten zu diesem Thema. Es ist aber auch in Englisch.
Das ist im Prinzip nicht so aufwendig. Man geht alle Flächen durch und zeichnet für jede Kante zwischen einem Polygon daß zum Licht hinzeigt und eins das wegzeigt so einen Streifen von dem Volumen. Der besteht aus 4 Punkten. Zwei davon kommen von der Kante und die restlichen beiden sind die extruhierten Versionen. Man kann das mit dem Vertex Shader so machen, daß automatisch alle Punkte mit w=0 extruhiert werden. Dann übergibt man zwei mal die gleichen Punkte von der Kante, einmal mit w=1 und einmal mit w=0. Weitere Detail stehen in dem PDF und in dem Tutorial.
Die nächste OpenGL Iteration wird Stencilschatten auch ziemlich beschleunigen, da dann auf einen zweiten Stencilpass verzichtet werden kann.
Der Nachteil ist, dass man halt die 3D-Mesh Informationen braucht (dafür kann man aber auch ein vereinfachtes Mesh hernehmen) und sich schwerer tut "weiche" Schatten zu generieren.
Dafür benötigt man keine weitere Textureinheit und muss auch keine Texturkoordinaten berechnen lassen, was die Integration in bestehenden Code stark vereinfacht.
Carmacks Reverse ist übrigens ziemlich füllratenintensiv - geschickter ist es IMHO den Algorithmus nur zu verwenden, wenn sichergestellt ist, dass der Betrachter im Schatten steht - ansonsten sind die "normalen" Stencilschatten um einiges schneller (Erfahrungswerte auf ATI 9000 und GFFX 5600).
Mitglieder in diesem Forum: 0 Mitglieder und 18 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.