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

Aktuelle Zeit: So Jun 09, 2024 15:51

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Mär 30, 2009 22:30 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Mär 09, 2005 15:54
Beiträge: 372
Wohnort: München
Programmiersprache: Delphi, C#, FPC
Ich hab da mal gerade ne Frage:

ich bastel gerade an einem Shadow-Mapping-Test + GLSL. Um etwas dynamik rein zu bringen, manipuliere ich beim Rendern ein Teil der Szene mit glTranslate. Jetzt mach ich es so, dass ich den Shader binde und dann die Szene zeichne. Während dem Zeichnen wird das glTranslate dann angewendet - also der Shader bleibt gebunden.

Wenn ich die Shadow-Map jetzt mit der Fixed-Function-Pipeline rendere, werden die Schatten korrekt auf die Objekte projeziert - auch auf die bewegten.

Wenn ich jetzt den Shader benutze, wird die Shadow-Textur nur korrekt projeziert, wenn ich die Szene nicht mit glTranslate ändere. Ändere ich die Position einzelner Polygone, wird die Shadow-Map so draufprojeziert als ob die ModelView-Matrix nicht geändert wurde. Die Polygone, die ich nicht bewegt habe, werfen die Schatten korrekt. Die Schatten der bewegten Objekte sind auch korrekt - nur die Schatten AUF den bewegten Objekten sind falsch.

Jetzt ist die Frage: muss ich den Shader nochmal neu binden, wenn ich die ModelView-Matrix ändere oder mach ich irgendwas falsch?

Grüße

_________________
Aktuelles Projekt: Gael - Development Blog
Website: LightBlackSoft.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 31, 2009 08:55 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Hast du noch irgendwelche Variablen, die an den Shader übergeben werden?

Wann hast du die Shadowmap erstellt? Ist dabei das glTranslate auch berücksichtigt?

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 31, 2009 14:46 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
wenn du mit einem shader shadowmapping realisieren willst, dann darfst du die shadowmap erst erstellen, wenn ale schattenwerfenden Objekte an ihrem Ort stehen, von dem sie aus betrachtet werden sollen! Ein Objekt kann in der realität ja auch nicht während die Lichtstrahlen der Sonne den Schatten produzieren einfach davon rennen und den Schatten einfach zurücklassen.

Du musst dir vorstellen, dass in der Tiefentextur der Zustand aller Objekte zu genau diesem zeitpunkt gespeichert ist. veränderst du die Position zu einem anderen Zeitpunkt eines Objektes musst du die Textur mit aktualisieren, da die Tiefen in der textur jetzt nicht mehr zur Szene passen. Also entweder aktualisieren, oder mit dem Schatten zeichen abwarten bis alles so steht wie es soll.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 31, 2009 17:52 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Mär 09, 2005 15:54
Beiträge: 372
Wohnort: München
Programmiersprache: Delphi, C#, FPC
Also die Schattentextur ist ansich korrekt - sonst würde die fixed-pipeline-methode nicht funktionieren. Es ist sehr schwer, das Phenomen zu beschreiben, daher hab ich mal meine Demo hochgeladen.

Der Download ist hier.

Am besten seht ihr das Problem, wenn ihr das Licht im Rendermodus 1 mit der Maus an eine Stelle positioniert und euch dann auf die bewegten Würfel achtet. Wenn ihr dann in den Fixed-Function-Pfad wechselt, funktioniert das alles. Das einzige was bei diesem Renderpfad anders ist, dass der Shader gebunden wird - sonst nichts.

Worauf ihr auch noch achten solltet sind die Schatten an der hinteren Wand - die sind nähmlich korrekt :shock:


Controls:
1: Rendermodus 1
2: Rendermodus 2
3: Rendermodus 3

F1: Spotlight-Textur vergrößern
F2: Spotlight-Textur verkleinern
P: Bewegung pausen / fortsetzen

5: Shader-Renderpfad aktivieren
6: Fixed-Function-Renderpfad aktivieren

W, S, A, D: Licht bewegen (im Rendermodus 1)
Maus: Licht bewegen (im Rendermodus 1)
Links/Rechts: Kamera rotieren

_________________
Aktuelles Projekt: Gael - Development Blog
Website: LightBlackSoft.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 31, 2009 19:12 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
okay, ich hbas mir mal angesehen und mir sind einige kleinigkeiten aufgefallen:

1. Es ist zu 100% offensichtlich, dass deine TiefenTextur im shader falsch auf die szene gemapped wird, um genau zu sein mapped der Shader die Tiefentextur so auf die Würfel, als würden sie immer im Zentrum stehen. Lösung ist wie gesagt, wenn du erst verschiebst und dann die Textur erstellst, ob du nu willst oder nicht. Dass es in der Fixed Function Pipeline funktioniert, kann daran liegen, das die Texturkoordinaten dort evtl. mit verschoben werden und das in die Shader variante nicht der Fall ist. wenn du also unbedingt deine Tiefentextur zuerst erstellen willst, dann musst du hinterher anhand der modelviewmatrix die neuen Koordinaten berechnen und ich wette, dass es blödsinn ist, das so zu machen, wenn man es auch einfacher haben kann in dem man die Reihenfolge ändert. Deinen Code konnte ich natürlich nicht einsehen, daher weiß ich nu auch nicht was man da evtl. noch alles probieren könnte.

2. dein Licht wirft den Spot auch in die negative Richtung.

Edit: Ich möchte nur anmerken, das ich noch nie selbst nen Schattenalgo ausprobiert habe, aber mich trotzdem schon viel damit auseinander gesetzt habe

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 31, 2009 20:39 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Mär 09, 2005 15:54
Beiträge: 372
Wohnort: München
Programmiersprache: Delphi, C#, FPC
Erstmal danke für deine Mühe :-)

Also die Szene wird genau so in den Tiefenpuffer und somit auch in die Tiefentextur gerendert, wie sie auch gezeichnet wird. Das kann man daran sehen, dass an der hinteren Wand der Schatten korrekt ist.

-> Ich zeichne die Szene erst komplett und kopier den Inhalt danach erst in die Textur, also wenn alles fertig ist. Die Transformation der Würfel wird auch im Depth-Pass vorgenommen.

Beim zweiten und letzten Renderdurchgang binde ich dann die Depth-Texture und rendere die Szene in der gleichen Reihenfolge wie vorher beim Tiefen-Pass. Ich hab auch schon probiert, den glTexGen-Methoden weg zu lassen - ohne erfolg.

Kann es sein, dass die VBOs, die ich benutze, da Probleme machen? Immerhin nimmt er immer die Vertex-Positionen, die auch im VBO sind. Das klingt zwar sehr utopisch, jedoch würde das die Mapping-Probleme erklären.

_________________
Aktuelles Projekt: Gael - Development Blog
Website: LightBlackSoft.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 01, 2009 18:06 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Mär 09, 2005 15:54
Beiträge: 372
Wohnort: München
Programmiersprache: Delphi, C#, FPC
Ich habs endlich geschafft!!! :-)

Ich übergeb jetzt an den Shader die aktuelle Transformations-Matrix und berechne dann die Shadow-Map-Position. Hier hab ich noch zwei Screenshots hochgeladen.

Danke für eure Antworten, die haben mich auf die richtige Spur gebracht.

_________________
Aktuelles Projekt: Gael - Development Blog
Website: LightBlackSoft.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 01, 2009 20:14 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
wow, sieht echt klasse aus, auch wenn ich kein Fan von Blooming bin, find ich es echt Klasse.

_________________
Klar Soweit?


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 22 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.054s | 15 Queries | GZIP : On ]