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

Aktuelle Zeit: Sa Apr 20, 2024 06:55

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Okt 08, 2015 12:03 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
Moin,
ich suche gerade die OpenGL-Spezifikation ab und kann es nicht finden. Gegeben sei folgender GLSL-Code:
Code:
  1. struct Foo {
  2.   vec4 a;
  3.   vec4 b;
  4.   vec4 c;
  5.   sampler2D tex;
  6. };
  7.  
  8. uniform Foo bar;

Wenn nun ein Aufruf von glGetUniformLocation(program, "bar.a") 1 zurückgibt, kann ich mich dann darauf verlassen, dass die Locations von bar.b = 2, von bar.c = 3 und von bar.tex = 4 ist? Meine Frage bezieht sich auf OpenGL/GLSL 3.3, also ohne explizit im Shader festgelegte Uniform-Locations.

Danke schonmal!

_________________
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: Do Okt 08, 2015 15:57 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Wenn nun ein Aufruf von glGetUniformLocation(program, "bar.a") 1 zurückgibt, kann ich mich dann darauf verlassen,.....

Nein.

Code:
  1.         struct materialParams {
  2.            vec4 emission;
  3.            vec4 ambient;
  4.            vec4 diffuse;
  5.            vec4 specular;
  6.            float shininess;
  7.         };
  8.  
  9.         struct Lighting {
  10.           vec4 position;
  11.           vec4 ambient;  
  12.           vec4 diffuse;    
  13.           vec4 specular;  
  14.         };
  15.  
  16.         uniform materialParams Material;
  17.  
  18.         uniform Lighting LightSource;


Diese Werte kommen dann bei glUniformLocation.
Code:
  1. Uniform LightSource.position: 3
  2. Uniform LightSource.ambient: 1
  3. Uniform LightSource.diffuse: 2
  4. Uniform LightSource.specular: 4
  5. Uniform Material.emission: 7
  6. Uniform Material.ambient: 5
  7. Uniform Material.diffuse: 6
  8. Uniform Material.specular: 9
  9. Uniform Material.shininess: 8
  10. Uniform ObjectMatrix: 10
  11. Uniform CameraMatrix: 0
  12. Uniform VecColor: 11
  13.  

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Okt 08, 2015 16:42 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Uniform locations sind nie garantiert sequentiell, egal ob in einem Struct oder bei einem Array mit direkt hintereinander liegenden Elementen. I.d.R. macht der GLSL-Compiler der Implementation irgendwo ein Reodering, deshalb passt dass dann meistens nicht.

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Okt 08, 2015 20:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
OK danke, dann brauche ich nicht weiter zu suchen. Ich muss das mit irgendwas durcheinander gebracht haben.

_________________
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: Fr Okt 09, 2015 08:04 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Vielleicht hast du da an uniform buffer gedacht. In denen kann man sequentiell feste structs verwenden.

Code:
  1.  
  2. struct MyStruct
  3. {
  4.     vec4 foo;
  5.     vec4 bar;
  6.     vec4 baz;
  7. };
  8.  
  9. layout(std140) uniform MyBufferBlock
  10. {
  11.     MyStruct blubber;
  12. };
  13.  


Der layout specifier std140 ist hier wichtig, sonst kann der compiler doch wieder machen was er will :)
Mit der Methode kannst du dir dann auch in der Programmiersprache deiner Wahl structs bauen, die genau das gleiche layout haben wie in GLSL und die über uniform buffer richtig einfach an deine shader übergeben.

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 26 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.071s | 18 Queries | GZIP : On ]