Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jun 08, 2024 10:07

Foren-Übersicht » Programmierung » Shader
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Sa Sep 18, 2010 09:48 
Offline
DGL Member

Registriert: Mi Mär 08, 2006 17:38
Beiträge: 153
Wohnort: Rümmelsheim (bei Bingen)
Hallo,

ich habe es soeben geschafft den Dual-Paraboloid Shadow Mapping Algorithmus zu implementieren. Das sieht alles sehr gut aus, allerdings wollte ich mal Fragen welche Verbesserungsvorschläge es gibt, um den Algorithmus zu optimieren.

Es gibt zwei Nachteile:
-Einmal können pixelige Kanten des Schattens entstehen. Dieses wollte ich mit Soft-Shadow Mapping verbessern.
-Der größte Nachteil ist die Clipping Ebene, die hintere und vordere Hemisphäre trennt. Wenn ein Schattenwerfendes Object diese Ebene schneidet, kommt es dort zu Fehlern. (siehe Bild: Meine Clipping Ebene liegt parallel zur Wand) Gibt es Möglichkeiten dies in den Griff zu bekommen? Hier ein paar Möglichkeiten und deren Probleme, die ich damit habe:


1) Die geschickte Wahl der Clipping-Ebene war eine Verbesserungsmöglichkeit. Allerdings hab ich nicht wirklich eine Ahnung wie ich solch eine geschickte Wahl treffen soll? Nach welchen Kriterien?

2) Eventuell eine 2te und dritte Shadowmap um 90° versetzt ? (Nachteil: 4 Renderpasses werden benöptigt)

3) Miteinbezug der "Nachbarpixel". Vielleicht gibt es eine Möglichkeit bei der Clipping-Ebene Informationen vor und hinter der Ebene mit einzubeziehen, um dann zu entscheiden, ob es hier Schattiert ist?


Vielen Dank für die Hilfe. :-)


Dateianhänge:
Dateikommentar: Schattenwerfendes Object (linker Block) scheidet die Clipping-Ebene
SM2.jpg [40.13 KiB]
Noch nie heruntergeladen
Dateikommentar: Kein Schattenwerfendes Object scheidet die Clipping-Ebene
SM1.jpg [42.19 KiB]
Noch nie heruntergeladen
Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Sep 18, 2010 12:54 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Habs selber noch nie gemacht, weiß also nicht wirklich was, aber:

Das Licht scheint ja mitten im schattenwerfenden Objekt zu sein (bzw sehr nah halt :wink: ). Gibts da eventuell auch schon Probleme mit der NearCP?

Wie renderst du die Shadowmap? Zwei Renderpasses, oder entscheidest du mit einem Geometryshader, auf welche Shadowmap das Dreieck kommt?
Wenn Geometryshader, schiebst du ein Dreieck auf beide Shadowmaps, wenn es die CP dazwischen schneidet? Wenn nicht, würde das nämlich einigermaßen zu dem passen, was am Bild ist.

So, mehr fallt mir nicht ein.

mfg


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Sep 18, 2010 13:14 
Offline
DGL Member

Registriert: Mi Mär 08, 2006 17:38
Beiträge: 153
Wohnort: Rümmelsheim (bei Bingen)
ja, bin extra sehr nahe ans objekt ran gegangen. Gut hier könnte man, trotz nahem licht, den renderpunkt immer ein stück vom objekt weg setzten. D.h. so eine Art Kollision bauen, die verhindert, dass es dem Objekt nicht zu Nahe kommt.

Der NearCP bezieht sich aber noch nur auf die gluPerspektive Matrix und setzt so das Frustum. Ich berechne meinen Tiefenwert in der Paraboloiden Map ja selbst mit
fSceneDepth = 2*(fLength-fNear)/(fFar-fNear)-1; fSceneDepth € [-1,1]
Habe sogar eben mal fNear auf 0 gesetzt, was leider auch nichts verbessert hat. Opengl Clippt ja zwischen Vshader und Fshader einfach wenn z nicht zwischen -1 und 1 liegt --> NearCP Wert müsste egal sein, da ich die Projektion selbst durchführe.

Zum Rendervorgang:
Die Clipping-Ebene ist meine xy-Ebene. Zunächst führe ich zwei Rendervorhänge durch und CULL_FACE ist ausgeschaltet. Für den hinteren Rendervorgang übergebe ich dem Shader einfach eine Variable mit dem Wert -1, mit dem der z-Wert des Vertex multipliziert wird.
Das Clipping muss ich manuell durchführen, da ich meinen Vertex für die Paraboloiden projektion normieren muss --> z-Wert ist ja also immer zwischen -1 und 1.
Im Fragmentshader entscheide ich dann mit if (z-Wert<0)discard; ob der Wert erfasst wird. Die Schattentextur ist übrigens in einem Framebuffer gebunden.


edit: fLengt = Länge des Normalisierten Vertex


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 12 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.038s | 16 Queries | GZIP : On ]