DGL
https://delphigl.com/forum/

Einelementige uniform-Arrays mit Intel-Grafik
https://delphigl.com/forum/viewtopic.php?f=20&t=11056
Seite 1 von 1

Autor:  glAwesome [ Do Dez 26, 2013 00:52 ]
Betreff des Beitrags:  Einelementige uniform-Arrays mit Intel-Grafik

Moin,
vorhin hatte ich folgendes Phänomen:
Code:
  1. // Fragmentshader
  2. #version 330
  3. const int g_NumLights = 1;
  4. struct SLight
  5. {
  6.   vec3 Pos;
  7.   vec3 Dir;
  8.   vec3 Color;
  9.   vec4 AttenCutoffExp;
  10. };
  11. uniform SLight g_Lights[g_NumLights];
  12. //...

Dieser Code compiliert (und linkt mit VS) einwandfrei und im Shader- und Program-Log steht "No errors." - egal ob ich meine Intel- oder Nvidia-Grafik verwende. Jedoch liefert der Aufruf von
Code:
  1. glGetUniformLocation(program, "g_Lights[0].Pos");
bei der Intel-Grafik -1. Der Intel-Treiber behauptet also, die uniform-Variable g_Lights[0].Pos gäbe es nicht. Sobald ich jedoch die Konstante g_NumLights auf einen größeren Wert setze oder auf Nvidia-GPU umschalte, funktioniert alles problemlos.

Kann man das als Fehler im Treiber bezeichnen? (Der hat ja eigentlich nie Schuld...)

Autor:  Pivi [ Do Dez 26, 2013 23:55 ]
Betreff des Beitrags:  Re: Einelementige uniform-Arrays mit Intel-Grafik

Hi,

ich hatte das gleiche Problem mit NVidia und AMD Treibern. Beim NVidia Treiber muss ich Array-Uniforms mit Array-Index ansprechen und bei AMD ohne.
Kann sein das Intel das auch ohne Array-Index macht (weis ich aber nicht).
Im Shader:
Code:
  1.  
  2. uniform vec4 mayArrayUniform[4];
  3.  


und in Delphi:
Code:
  1.  
  2. // Das glGetString() sollte man natürlich nur einmal beim Programmstart aufrufen
  3. if (pos('NVIDIA', glGetString(GL_VENDOR)) > 0) then
  4.   //NVidia
  5.   glGetUniformLocation(program, "myArrayUniform[0]")
  6. else 
  7.   // AMD
  8.   glGetUniformLocation(program, "myArrayUniform");
  9.  



vielleicht liegt es daran.

Gruß

Autor:  glAwesome [ So Dez 29, 2013 00:38 ]
Betreff des Beitrags:  Re: Einelementige uniform-Arrays mit Intel-Grafik

Danke für deine Antwort.

Das Prüfen, von welchem Hersteller die Grafikkarte ist, ist aber eigentlich nicht im Sinne von OpenGL. Ziel von OpenGL ist doch eigentlich, eine plattformunabhängige API bereitzustellen, so dass alles gleich funktioniert, auch wenn die Hardware verschieden ist.

Für mich sieht das so aus, als wenn der Intel-Treiber eine "Optimierung" vornimmt, die aus einem Array eine gewöhnliche Variable macht. Ich glaube nicht, dass das zulässig ist.

Autor:  Bergmann89 [ So Dez 29, 2013 01:10 ]
Betreff des Beitrags:  Re: Einelementige uniform-Arrays mit Intel-Grafik

Hey,

glAwesome hat geschrieben:
Ziel von OpenGL ist doch eigentlich, eine plattformunabhängige API bereitzustellen, so dass alles gleich funktioniert, auch wenn die Hardware verschieden ist.
Ist richtig, aber wir hatten da schon öfter Probleme. Besstes Beispiel sind varyings. Die sind eigentlich deprecated, man soll "in" und "out" nutzen, ABER: NVIDIA will "varying out/in" und AMD will nur "in/out". "varying" geht aber bei beiden.
Mach doch zum Test einfach mal ein Array mit 2 Elementen in dein uniform, dann weißt du was es ist...

MfG Bergmann.

Autor:  glAwesome [ So Dez 29, 2013 01:17 ]
Betreff des Beitrags:  Re: Einelementige uniform-Arrays mit Intel-Grafik

Also bei mir akzeptiert der Nvidia-Treiber das in/out und warnt sogar, wenn ich varying verwende, dass dies deprecated ist. Voraussetzung für in/out ist natürlich, dass man die #version-Direktive entsprechend gesetzt hat.

Wenn ich das uniform-Array auf 2 oder mehr Elemente vergrößere, funktioniert wie gesagt alles. Das Problem ist also bisher eher theoretisch.

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