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:
  1. function TglcShaderProgram.Uniform1iv(const aName: String; aCount: GLint; aP1: PGLInt): Boolean;
  2. var
  3.   pos: GLint;
  4. begin
  5.   result := GetUniformLocation(aName, pos);
  6.   if result then
  7.     glUniform1iv(pos, aCount, aP1);
  8. end;


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:
  1. function TglcShaderProgram.GetUniformLocation(const aName: String; out aPos: glInt): Boolean;
  2. begin
  3.   aPos := glGetUniformLocation(fProgramObj, PChar(aName));
  4.   result := (aPos <> -1);
  5.   if not result then
  6.     Log(StringReplace(ERROR_STR_VAR_NAME, '%s', aName, [rfIgnoreCase, rfReplaceAll]));
  7. end;

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/