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

Aktuelle Zeit: Do Mär 28, 2024 11:07

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Dez 26, 2013 00:52 
Offline
DGL Member
Benutzeravatar

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

_________________
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 Dez 26, 2013 23:55 
Offline
DGL Member

Registriert: Mo Okt 01, 2012 13:21
Beiträge: 5
Programmiersprache: Delphi, Python
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ß


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Dez 29, 2013 00:38 
Offline
DGL Member
Benutzeravatar

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

_________________
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: So Dez 29, 2013 01:10 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
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.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Dez 29, 2013 01:17 
Offline
DGL Member
Benutzeravatar

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

_________________
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  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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.401s | 17 Queries | GZIP : On ]