Hallo, ich benutze die LazOpenGLCore und zur Werteübergabe an den Shader wird folgene function benutzt
Code:
function TglcShaderProgram.Uniform1iv(const aName:String; aCount: GLint; aP1: PGLInt):Boolean;
var
pos: GLint;
begin
result := GetUniformLocation(aName,pos);
if result then
glUniform1iv(pos, aCount, aP1);
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.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ruft GetUniformLocation immer glGetUniformLocation auf oder speichern die die Location schon irgendwo intern?
viele Grüße, Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my 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
Registriert: So Aug 08, 2010 08:37 Beiträge: 460
Programmiersprache: C / C++ / Lua
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
_________________ offizieller DGL Compliance Beauftragter Never run a changing system! (oder so)
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).
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
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).
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
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.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
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.
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.