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

Aktuelle Zeit: Fr Jul 18, 2025 19:22

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: glGetUniformLocation > Performance
BeitragVerfasst: Fr Jul 20, 2012 12:00 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
Hallöchen,

ich hab grad mal hier gDEbugger am laufen. Ist ja ein echt geiles Programm!!! Doch dies sagt mir das ich glGetUniformLocation ziemlich oft beim Rendern aufrufe.. das ist in der Tat so...
Zitat:
Using "Get" or "Is" functions slows down render performance. These commands force the graphic system to execute all queued OpenGL calls before it can answer the "Get" or "Is" query.
Some get functions such as this one are necessary, but only during the initialization of the OpenGL application.
Avoid using these get functions outside the application initialization.


mhh.. Ich hab im Wiki nirgends gelesen das dies so fatal ist.. ich übergebe meine Uniforms immer direkt so:
Code:
  1.  
  2. glUniform1i(glGetUniformlocation(sh.po, 'MyVar'), 0);
  3.  


So hab ich immer schön Ordnung.. Doch dies mach ich extrem oft im Program, da ich auch viele Shader nutze.. Nun die Frage: Wie sehr bremst denn diese Methode?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jul 20, 2012 13:39 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
man sollte die Locations in Variablen nach dem Linken speichern, diese bleiben nach dem linken, bis zum erneuten linken gleich, siehe:

http://wiki.delphigl.com/index.php/glGetUniformLocation

nebenbei sollte man das im GLSL tutorial ergänzen...

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jul 20, 2012 14:30 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
ja, bei mittlerweile über 60 Shadern wäre das in meinem aktuellen Projekt ein morts Aufwand, daher wüsst ich gern ob das was ausmacht :roll:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jul 20, 2012 14:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
.o(klingt nach nem bug im design wenn das nicht in einer Shaderklasse implementiert werden kann ;) )

Ja, das wird ziemlich sicher was ausmachen. Das zerlegt die parallelität von OpenGL. Wenn du OpenGL zeichenaufträge gibts, werden die an die Grafikkarte geschickt und dann hast du schon die Kontrolle wieder. D.h. du kannst weitere Aufträge geben und während dessen zeichnet die Grafikkarte fröhlich vor sich hin. Wenn du aber glGet* aufrufst, muss OpenGL warten bis alle Befehle ausgeführt wurden, da diese ja den Rückgabewert von glGet* beeinflussen könnten. Das bremst die Sache durchaus aus, besonders wenn es oft passiert. Dann wartest du immer wieder auf OpenGL, obwohl du die Zeit sinnvoller nutzen könntest (weitere Befehle senden, Logik berechnen…)

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jul 20, 2012 17:10 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
Zitat:
.o(klingt nach nem bug im design wenn das nicht in einer Shaderklasse implementiert werden kann ;) )


nunja ich habe schon meine TGLSLShader klasse. Doch hier hätt ich nun 2 Möglichkeiten:

1. Ich erstelle mir pro Shader eine abgeleitete Klasse von TGLSL und nutze Propertys als Uniforms.. Hier würde ich beim Create dann alle Locations suchen und privat speichern. Dies wäre die "schöne" Variante. Nachteil: Ich müsste für jeden Shader eine neue Klasse machen..

2. Ich bau mir eine Uniformlocation Liste in meine TGLSLShader klasse und eine Funktion "AddUniform(Name)"... In diese Liste enthalten ist dann entsprechend der Name und die entsprechende Lokalisierte ID. Hier ist jedoch der nachteil, das wenn ich beim Rendern nun eine Uniform zuweise, er erst in der Liste nach passenden Suchen muss..


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jul 20, 2012 17:20 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Das ist beides unschön, da stimme ich zu. Das einzig gut mögliche wäre ne Hashliste, die sollte ausreichend schnell beim raussuchen der IDs sein. Oder da wo du die schader verwendest die IDs cachen.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


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 5 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.008s | 16 Queries | GZIP : On ]