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

Aktuelle Zeit: Mo Mai 13, 2024 23:23

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Feb 22, 2012 22:58 
Offline
DGL Member

Registriert: Sa Mär 26, 2011 12:08
Beiträge: 17
Ich arbeite zurzeit an einer Beleuchtung per Shader für meine Engine. Ich habe bisher den PerPixel-Shader 2 aus der Shadersammlung übernommen.
Mit directional-lights funktioniert das ganze auch bei einer relativ komplexen Szene (das Sponza-Modell von Crytek) wunderbar bei flüssigen 60 FPS.
Doch sobald ich positional-lights benutze, bricht die Performance drastisch ein, selbst bei nur einem Licht komme ich auf meiner GTX 460 nur noch auf knapp 30 FPS.
Ich hab bisher absolut keinen Plan woran das liegen könnte...das Programm macht bisher eigentlich nichts anderes als eine Skybox rendern (ohne Shader natürlich),
dann den Shader zu binden (bisher so ziemlich unverändert der Shader aus der Sammlung), und dann das in VBO's geladene Modell rendern.

Hier der (anscheinend) kritische Teil des Shaders:

Code:
  1.     if (gl_LightSource[i].position.w != 0.0)
  2.     {
  3.         // positional light source
  4.         lightDir    = (gl_LightSource[i].position.xyz - position);
  5.         float dist  = length(lightDir);
  6.         lightDir = normalize(lightDir);
  7.         attenFactor = 1.0/( gl_LightSource[i].constantAttenuation +
  8.                     gl_LightSource[i].linearAttenuation * dist +
  9.                     gl_LightSource[i].quadraticAttenuation * dist * dist );
  10.     }      
  11.     else
  12.     {          
  13.         // directional light source        
  14.         attenFactor = 1.0;         
  15.         lightDir    = gl_LightSource[i].position.xyz;      
  16.     }  


doch selbst wenn man den oberen Teil abändert zu

Code:
  1.     if (gl_LightSource[i].position.w != 0.0)
  2.     {
  3.         // positional light source
  4.         lightDir    = (gl_LightSource[i].position.xyz - position);
  5.         attenFactor = 1.0;
  6.     }  


bleibt die Performance im Keller...hat jemand eine Ahnung woran das liegen könnte?

[Edit]
Und noch eine generelle Verständnisfrage...die Standard-OpenGL-Lichter werden ja als Uniforms an den Shader übergeben. Doch spielt es nun eine Rolle wann die Lichter gesetzt werden? (vor binden des shaders, oder muss es während der Shader gebunden ist sein?)

//Titel angepasst sodass diverse Skripte darauf matchen können -- horazont ([Solved....] -> [Solved])


Zuletzt geändert von Edlmann am Do Feb 23, 2012 14:47, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Feb 23, 2012 12:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Sehr merkwürdiges Ding. Meldet dir der Shadercompiler irgendwelche Fehler oder Warnungen? Am besten mal absichtlich Fehler einbauen um das zu testen und die Meldungen auch dann ausgeben lassen wenn der Compiler einen Erfolg meldet.

Zitat:
Doch spielt es nun eine Rolle wann die Lichter gesetzt werden? (vor binden des shaders, oder muss es während der Shader gebunden ist sein?)

Sollte egal sein. Ich glaube es ist sogar egal ob die einzelnen Lichter eingeschaltet sind.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Feb 23, 2012 13:16 
Offline
DGL Member

Registriert: Sa Mär 26, 2011 12:08
Beiträge: 17
Nein, weder der Shader-Compiler noch Open-GL meldet irgendwelche Fehler...bin so langsam mit meinem Latein am Ende, da dieser Fehler ja absolut keinen Sinn ergibt...
Der einzige Unterschied ist das - position, doch das sollte doch nicht die Framerate derartig in den Keller gehen lassen...hab grad mal VSync abgeschaltet, mit directional light
erreiche ich Frameraten bis 160 FPS...pointlights nur 30 FPS...ich benutze im Moment sogar nur eine einzige Lichtquelle, bei mehreren sinkt die Framerate dementsprechend...
Ich habe bisher noch nichtmal implementiert dass jedes Objekt von den 3-4 nächsten Lichtern beleuchtet wird (ist noch auf der TODO-Liste ;) ), sondern einfach Stumpf Lichter anwenden,
Shader binden, Rendern...

Mir ist noch etwas komisches aufgefallen: anscheinend wird die w-Koordinate nicht korrekt übergeben...
Ich benutze zum Speichern der Position ein Record, das wie folgt deklariert ist:

Code:
  1.   TVec4 = record
  2.     x, y, z, w: TGLFloat;
  3.     //Operatoren für + - etc etc
  4.   end;


initialisiere die Position mit:

Code:
  1.   m_Pos := Vec4D(px, py, pz, 1);


px,py,pz sind die Koordinaten des Lichts, Vec4D gibt einfach einen TVec4 zurück, der die Daten enthält,
und wende das Licht dann mit

Code:
  1.   glLightfv(GL_LIGHT0 + iNummer, GL_POSITION, @m_Pos);


an...während x,y,z korrekt übergeben werden, bekommt der Shader vom w-Wert anscheinend nichts mit (die if-Abfrage scheitert, und wechselt Standardmäßig zu Directional-Lights)...


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Feb 23, 2012 14:12 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Die w-koordinate darfst du, soweit ich weiß, leider nicht bei Positionen verwenden.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Feb 23, 2012 14:16 
Offline
DGL Member

Registriert: Sa Mär 26, 2011 12:08
Beiträge: 17
Wie genau meinst du das?

[Edit]
Fehler gefunden, Fehler gefixxt...hatte beim Neu-Positionieren der Lichter ausversehen noch 0 als w-Koordinate übergeben...jetzt funktioniert alles wunderbar...
Manchmal sieht man den Wald vor lauter Bäumen nicht...


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Feb 23, 2012 14:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Bin mir nicht mehr ganz sicher, ich hatte mal die W komponente meiner Lichter genommen um einen
Switch für 32+32 bit Beleuchtung zu realisieren dabei gabs dann Probleme und ich musste halt die RGB
werte an sich nehmen und hatte letztenendes 32+32+32 bit Beleuchtung <.<

_________________
Meine Homepage


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.052s | 17 Queries | GZIP : On ]