DGL https://delphigl.com/forum/ |
|
GetUniformLocation-Werte im Shader Object speichern https://delphigl.com/forum/viewtopic.php?f=20&t=11473 |
Seite 1 von 1 |
Autor: | Twist [ Mo Jan 18, 2016 08:27 ] |
Betreff des Beitrags: | GetUniformLocation-Werte im Shader Object speichern |
Hallo, ich benutze die LazOpenGLCore und zur Werteübergabe an den Shader wird folgene function benutzt Code:
Bei jeder Wertübergabe wird dadurch GetUniformLocation aufgerufen. Kann man die Positionen der Uniform's irgendwie im TglcShaderObject speichern? Globale Variablen sind dafür etwas unelegant. Wie löst Ihr soetwas? |
Autor: | Lord Horazont [ Mo Jan 18, 2016 11:25 ] |
Betreff des Beitrags: | Re: GetUniformLocation-Werte im Shader Object speichern |
Ruft GetUniformLocation immer glGetUniformLocation auf oder speichern die die Location schon irgendwo intern? viele Grüße, Horazont |
Autor: | Twist [ Mo Jan 18, 2016 23:22 ] |
Betreff des Beitrags: | Re: GetUniformLocation-Werte im Shader Object speichern |
GetUniformLocation schaut nur, ob es das Uniform im Shader auch gibt. Code:
|
Autor: | end [ Di Jan 19, 2016 10:18 ] |
Betreff des Beitrags: | Re: GetUniformLocation-Werte im Shader Object speichern |
Kann man halt in einer Hashmap oder so zwischenspeichern, ist imo aber eher unnoetig, schliesslich speichert es der Treiber vmtl. auch einfach in einer Hashmap -> premature optimization |
Autor: | Sascha Willems [ Di Jan 19, 2016 17:44 ] |
Betreff des Beitrags: | Re: GetUniformLocation-Werte im Shader Object speichern |
Welche OpenGL-Version wird denn verwendet? Wenn nur modernes OpenGL genutzt wird, würde ich auf einzelne Uniforms komplett verzichtne und nur noch Uniform Blöcke mit entsprechenden Bindings verwenden (https://www.opengl.org/wiki/Interface_Block_(GLSL)#Uniform_blocks). Das ist am performantesten und schonmal ne gute Vorbereitung auf z.B. Vulkan, da gehts nur noch über bindings und layout qualifier |
Autor: | mathias [ Di Jan 19, 2016 18:14 ] |
Betreff des Beitrags: | Re: GetUniformLocation-Werte im Shader Object speichern |
Zitat: Wenn nur modernes OpenGL genutzt wird, würde ich auf einzelne Uniforms komplett verzichtne und nur noch Uniform Blöcke mit entsprechenden Bindings verwenden (https://www.opengl.org/wiki/Interface_Block_(GLSL)#Uniform_blocks). Dein Link zeigt in einen leeren Wiki-Beitrag.Bei Uniform Blöcken gibt es einige Stolperfallen, siehe diesen Thread. viewtopic.php?f=20&t=11450 |
Autor: | glAwesome [ Mi Jan 20, 2016 12:00 ] |
Betreff des Beitrags: | Re: GetUniformLocation-Werte im Shader Object speichern |
end hat geschrieben: Kann man halt in einer Hashmap oder so zwischenspeichern, ist imo aber eher unnoetig, schliesslich speichert es der Treiber vmtl. auch einfach in einer Hashmap -> premature optimization Genau so ist es. Von den Mesa-Treibern ist z.B. bekannt, dass die dafür eine Hashmap verwenden. Ich löse das persönlich so, dass ich mir für jeden Shader eine eigene Klasse automatisch generieren lasse. Für jede Uniform-Variable hat diese Klasse die location als Member. Dann gibt es noch eine Init-Funktion die nach dem Linken des Shaders einmalig aufgerufen wird und alle Uniform-Locations abfragt. Dadurch spare ich mir das Hantieren mit langsamen Strings während des Renderns. Und für größere Sachen gibt es wie gesagt UBOs (oder Uniform-Arrays).
|
Autor: | Twist [ Mi Jan 20, 2016 12:05 ] |
Betreff des Beitrags: | Re: GetUniformLocation-Werte im Shader Object speichern |
Zitat: Kann man halt in einer Hashmap oder so zwischenspeichern, ist imo aber eher unnoetig, schliesslich speichert es der Treiber vmtl. auch einfach in einer Hashmap -> premature optimization Gut dann braucht man sich also um das ständige glGetUniformLocation-Gefrage keine Gedanken machen. Zitat: Dein Link zeigt in einen leeren Wiki-Beitrag bei mir geht er und die Uniform Blöcke werde ich mir mal ansehen.
|
Autor: | mathias [ Mi Jan 20, 2016 16:41 ] |
Betreff des Beitrags: | Re: GetUniformLocation-Werte im Shader Object speichern |
Zitat: Und für größere Sachen gibt es wie gesagt UBOs (oder Uniform-Arrays). Leider gibt es keine Uniform-Record. Das würde die Uniform-Übergabe auch ein bisschen vereinfachen. Zitat: bei mir geht er und die Uniform Blöcke werde ich mir mal ansehen. Jetzt geht er bei mir auch. |
Autor: | Sascha Willems [ Mi Jan 20, 2016 18:03 ] |
Betreff des Beitrags: | Re: GetUniformLocation-Werte im Shader Object speichern |
mathias hat geschrieben: Leider gibt es keine Uniform-Record. Das würde die Uniform-Übergabe auch ein bisschen vereinfachen. Klar geht das, man kann wie aus C(++) gewohnt structs deklarieren und innerhalb eines UBOs verwenden. Idealerweise mit dem selben Layout wie in der Anwendung, dann kann man die Daten direkt hochladen. |
Autor: | mathias [ Mi Jan 20, 2016 18:30 ] |
Betreff des Beitrags: | Re: GetUniformLocation-Werte im Shader Object speichern |
Zitat: Klar geht das, man kann wie aus C(++) gewohnt structs deklarieren und innerhalb eines UBOs verwenden. Aber leider nicht ohne UBOs. |
Seite 1 von 1 | Alle Zeiten sind UTC + 1 Stunde |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |