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

Aktuelle Zeit: Fr Jul 18, 2025 11:23

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



Ein neues Thema erstellen Auf das Thema antworten  [ 68 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4, 5  Nächste
Autor Nachricht
BeitragVerfasst: Fr Okt 08, 2010 10:22 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
irgendwie muss es da doch noch ne andere möglichkeit geben? Kann mir nicht vorstellen das die anderen für jede Lichtquelle die Szene neu rendern.. Hab da schon sachen gesehen wo 100 Lampen mit Schatten & Co total flüssig liefen..
Hab ich denn im Shader nicht irgendwie zugriff auf den aktuellen Tiefenpuffer? Wenn ich nur auf die Fragmente Projeziere, welche am nähsten dran sind dann hätt ich doch schon meinen schatten..


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Okt 08, 2010 10:38 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Hab ich denn im Shader nicht irgendwie zugriff auf den aktuellen Tiefenpuffer?

Du brauchst den Tiefenbuffer aus Perspektive der Lichtquelle, nicht aus Perspektive der Kamera! Der Tiefenbuffer der Kamera nutzt dir gar nichts.

Möglichkeiten:
1. Wenn du die ShadowMaps renderst interessiert nur die Tiefeninformation. Hier wird also nur die pure Geometrie gerendert, kein Licht, keine Texturen usw. Das ist üblicherweise recht schnell.
2. Ggf. reicht es die ShadowMap nur alle paar Frames zu aktualisieren. Wenn du 10 Lampen hast aktualisierst zu dann in jedem Frame nur 2 der ShadowMaps.
3. Wenn die Szene eine einfache Geometrie hat oder sie durch einfache Geometrie approximiert werden kann, kannst du etwas wie in meinem Kegelvolumenschatten-Shader versuchen, siehe Shadersammlung. D.h. einfach im Fragmentshader berechnen ob ein Objekt den Strahl zwischen Lichtquelle und Fragment stört. Geht aber nur bei einfacher Geometrie, du kannst unmöglich im Fragmentshader für jedes Fragment alle Dreiecke in der Szene testen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Okt 08, 2010 10:59 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
4. Wenn sich nix (relevantes) bewegt hat, brauchst du die Shadowmaps auch gar nicht neu zeichnen. Wenn sich aber deine Lichter Bewegen, geht das natürlich nicht. Bei translationen zumindest. Bei Rotationen kann man ggf immer noch die alte ShadowMap verwenden, wenn man da zB eine CubeMap verwendet. (Also, bei Spotlights. bei unendlich weit entfernten Lichtquellen ists wenn schon umgekehrt.) Wenn sich aber in deiner Szene auch noch irgendwas bewegt, ist das mit den CubeMaps wieder eher kontraproduktiv.

5. Unter Umständen brauchen die ShadowMaps keine allzu hohe Auflösung. Geringe Auflösung spart bekanntlich Füllrate. Zu geringe Auflösung macht dann aber Aliasing, also auch nicht übertreiben. Ich will damit nur sagen, die ShadowMaps müssen nicht grad 8192x8192 sein ;)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Okt 08, 2010 11:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Das mit den CubeMaps stimmt natürlich. Sofern die Szene abgesehen von den Lichtquellen komplett statisch ist brauchst du die CubeMaps nur einmal generieren oder kannst sie sogar direkt aus einer Datei laden.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Okt 08, 2010 11:40 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
Also rel. statisch ist bei mir nur die Szene, aber auch die kann verändert werden.. Aktuell schiebe ich ja schon für jeden Projektor eine Textur in den Shader, nämlich die die projeziert werden soll. Kann ich nicht diese irgendwie vorher schon entsprechend verändern? Ansonsten müsst ich ja dann nochmal für jede Lampe noch eine Textur in den Shader bringen.. Da gehen mir aber meine TMUs aus... Obwohl ich gelesen hab das ich schon auf durchschnittlichen Rechnern mit 16 TMUs rechnen kann.. Aktuell nutze ich 8.

Meine Shadowmap müsste ja nicht größer sein als die zu projeziernde Lichttextur.. D


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Okt 08, 2010 11:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Du kannst die Projektionstextur in die ShadowMap integrieren. Du musst ja nur die Z-Werte in der ShadowMap so nahe wie möglich an die Lichtquelle setzen da die Textur undurchsichtig sein soll.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Okt 08, 2010 17:00 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
nochmal kurz zurück zu der Projektion auf den "Rückseiten". Eigentlich sollte es doch auch so funktionieren, das nur auf flächen welche dem projektor zugewannt sind projeziert wird oder?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Okt 08, 2010 17:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Eigentlich sollte es doch auch so funktionieren, das nur auf flächen welche dem projektor zugewannt sind projeziert wird oder?

Ich dachte das hättest du mittlerweile hin bekommen...wie gesagt über das Dot-Produkt kannst du sowas leicht feststellen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Okt 08, 2010 17:27 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
ne, jetzt wird nur nicht mehr auf die Rückseiten der Flächen projeziert.. Aber habe ich z.B. einen Würfel wo von hinten ein Licht gegenscheint, sehe ich auch an der Vorderseite die projektion..


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Okt 08, 2010 18:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Du machst irgendwas falsch, informiere dich am besten mal über die Eigenschaften des dot-Produktes.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Okt 08, 2010 20:20 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
ich denke vielleicht stimmt die Lichtposition nicht richtig. Ich habe ja die Texturmatrix welche ja aus sicht der Lichtquelle erstellt wurde. Krieg ich da nicht irgendwie den Vektor der lampe?

Grüße


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Okt 08, 2010 20:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
ich denke vielleicht stimmt die Lichtposition nicht richtig.

Coolcat hat geschrieben:
Ist den die Position der Lichtquellen im gleichen Koordinatensystem wie posEye? Vielleicht posWorld statt posEye ?


Zitat:
Ich habe ja die Texturmatrix welche ja aus sicht der Lichtquelle erstellt wurde. Krieg ich da nicht irgendwie den Vektor der lampe?

Müsste die dritte Zeile der Matrix sein, also:
Code:
lightvec = vec3(TexGenMats[i][0][2], TexGenMats[i][1][2], TexGenMats[i][2][2]);

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Okt 15, 2010 08:07 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
Zitat:
lightvec = vec3(TexGenMats[i][0][2], TexGenMats[i][1][2], TexGenMats[i][2][2]);


ne auch der Vektor stimmt net.. Aber jetzt pass mal auf:

wenn ich nun den Lichtvektor anstatt über meine uniformvariable mittels der OGL Lichtposition an den Shader übergebe funktionierts?!?

Also quasi nur:

Code:
glLightfv(GL_LIGHT0+i, GL_POSITION, @lightPos[0]);

und im Shader:

    lightDir = vec3(gl_LightSource[i].position.xyz - posEye.xyz);


Denn hauts hin..
Aber wenn ich die Positionen über unform übergebe stimmt der Vektor irgendwie nich, bzw ändert sich die Berechnung abhängig von der Camera..

Wird die OGL Lichtposition nochmal umgerechnet?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Okt 15, 2010 08:52 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Wird die OGL Lichtposition nochmal umgerechnet?

Auf die Lichtposition wird die ModelView-Matrix zu dem Zeitpunkt angewendet an dem du die Lichtposition setzt.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Okt 15, 2010 10:40 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
supi jetzt hauts hin.. hab mit der ModelMatrix multipliziert...
Das einzige was mit jetzt auflällt ist das hier physikalisch was nicht stimmt... Ich glaube sogar das das bei den OGL lichtern genauso ist.. Also um die selbstbeschattung hinzubekommen multipliziere ich mit dem Labertterm (dot(Light, Normal)). Sieht auch super aus, doch je näher meine Lichtquelle an eine fläche kommt desto dunkler wirds.. aber eigentlich müsst es, da ich noch keine lichtabnahme implementiert habe, gleich bleiben..


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 68 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4, 5  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 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.010s | 15 Queries | GZIP : On ]