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

Aktuelle Zeit: Do Mär 28, 2024 23:18

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Jan 18, 2016 08:27 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 12, 2013 07:45
Beiträge: 61
Programmiersprache: Turbo Delphi 2006
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?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 18, 2016 11:25 
Offline
DGL Member
Benutzeravatar

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 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: Mo Jan 18, 2016 23:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 12, 2013 07:45
Beiträge: 61
Programmiersprache: Turbo Delphi 2006
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;


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jan 19, 2016 10:18 
Offline
Compliance Officer
Benutzeravatar

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)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jan 19, 2016 17:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
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 ;)

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jan 19, 2016 18:14 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
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

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jan 20, 2016 12:00 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
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)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jan 20, 2016 12:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 12, 2013 07:45
Beiträge: 61
Programmiersprache: Turbo Delphi 2006
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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jan 20, 2016 16:41 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
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.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jan 20, 2016 18:03 
Offline
DGL Member
Benutzeravatar

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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jan 20, 2016 18:30 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Klar geht das, man kann wie aus C(++) gewohnt structs deklarieren und innerhalb eines UBOs verwenden.

Aber leider nicht ohne UBOs.

_________________
OpenGL


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.130s | 17 Queries | GZIP : On ]