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

Aktuelle Zeit: So Apr 28, 2024 22:02

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Sep 20, 2023 14:24 
Offline
DGL Member
Benutzeravatar

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

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Sep 22, 2023 14:27 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
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.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Sep 22, 2023 15:05 
Offline
DGL Member
Benutzeravatar

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

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Sep 22, 2023 18:42 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
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.

_________________
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: Sa Sep 23, 2023 07:42 
Offline
DGL Member
Benutzeravatar

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

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Sep 25, 2023 18:53 
Offline
DGL Member
Benutzeravatar

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

_________________
OpenGL


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


Wer ist online?

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