DGL
https://delphigl.com/forum/

Falsche Array-Grösse bei glGetActiveUniform
https://delphigl.com/forum/viewtopic.php?f=20&t=11747
Seite 1 von 1

Autor:  mathias [ Mi Sep 20, 2023 14:24 ]
Betreff des Beitrags:  Falsche Array-Grösse bei glGetActiveUniform

Wieso wird mir MyColor[0] anstelle von MyColor[3] ausgegeben ?
"len" kommt richtig, da ist es 3.

Code:
  1. var
  2.   s: array of PChar = nil;
  3.   i, Count: GLint;
  4.   Typ: GLint = 0;
  5.   len: GLint = 0;
  6.   size: GLint = 0;
  7.  
  8. begin
  9.   SetLength(s, 255);
  10.  
  11.   glGetProgramiv(Shader.ID, GL_ACTIVE_UNIFORMS, @Count);
  12.   for i := 0 to Count - 1 do begin
  13.     glGetActiveUniform(Shader.ID, i, Length(s), len, size, Typ, PChar(s));
  14.    WriteLn('  ' + PChar(s) + '    ' + IntToStr(size));
  15.   end;
  16. end;  

Code:
  1. #version 330
  2.  
  3. out vec4 outColor;
  4.  
  5. uniform float MyColor[3]; // Hier steht "3"
  6. uniform vec3 Color;
  7.  
  8. void main(void)
  9. {
  10.   outColor = vec4(MyColor[0], MyColor[1], MyColor[2], 1.0);
  11.   outColor.rgb += Color;
  12. }  

Ausgabe:
Code:
  1. MyColor[0]    3
  2.   Color    1

Müsset da nicht MyColor[3] kommen ?

Autor:  TAK2004 [ Fr Sep 22, 2023 14:27 ]
Betreff des Beitrags:  Re: Falsche Array-Grösse bei glGetActiveUniform

Sieht für mich korrekt aus, du bekommst eine variable vom typ GL_FLOAT mit 3 Elementen zurück.
size ist ist Elementanzahl und type gibt dir den Datentyp zurück.
Wenn du ein struct hast, wie bei vec3, dann können da 3 floats drin sein(x,y,z) aber der type ist vec3 und es ist nur 1 Element davon.

Autor:  mathias [ Fr Sep 22, 2023 15:05 ]
Betreff des Beitrags:  Re: Falsche Array-Grösse bei glGetActiveUniform

Was mich verwundert, wieso das es in den [] eine Null hat. Wen dort eine 3 stehe würde, würde es doch mehr Sinn machen, oder ?

Autor:  glAwesome [ Fr Sep 22, 2023 18:42 ]
Betreff des Beitrags:  Re: Falsche Array-Grösse bei glGetActiveUniform

Aus meiner Erinnerung hätte ich gesagt, dass wenn MyColor[0] die ID x hat, dass MyColor[1] dann die ID x+1 hat usw. Im Widerspruch dazu steht in der Doku allerdings Folgendes:
man glGetActiveUniform hat geschrieben:
If one or more elements of an array are active, the name of the array is returned in name, the type is returned in type, and the size parameter returns the highest array element index used, plus one, as determined by the compiler and/or linker. Only one active uniform variable will be reported for a uniform array.

Aber in der Praxis holt man sich doch sowieso nur die ID von MyColor[0] und setzt dann für das gesamte Array die Werte mittels glUniform3fv. Oder man nutzt UBOs.

Autor:  mathias [ Sa Sep 23, 2023 07:42 ]
Betreff des Beitrags:  Re: Falsche Array-Grösse bei glGetActiveUniform

Das vermute ich auch, aber es hat mich trotzdem verwundert.

Mit OpenGL 4 geht es sogar so:
Code:
  1. layout(location = 20) uniform vec3 Color;  // Farbe von Uniform

Autor:  mathias [ Mo Sep 25, 2023 18:53 ]
Betreff des Beitrags:  Re: Falsche Array-Grösse bei glGetActiveUniform

Ich habe es jetzt mal Mehrdimensional probiert.
Code:
  1. #version 430
  2. uniform float MyColor[2][2][2];

Da bekomme ich folgende Ausgabe:
Code:
  1.   MyColor[0][0][0]    2
  2.   MyColor[0][1][0]    2
  3.   MyColor[1][0][0]    2
  4.   MyColor[1][1][0]    2

Die vorderen 2 Dimensionen würden stimmen,
Ich habe noch folgendes probiert:
Code:
  1.   WriteLn(glGetUniformLocation(ID,'MyColor[0][1][0]'));
  2.   WriteLn(glGetUniformLocation(ID,'MyColor[0][1][1]'));

Da wird die Zahl in der letzen [] geschluckt.

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/