Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Moin, vorhin hatte ich folgendes Phänomen:
Code:
// Fragmentshader
#version 330
constint g_NumLights =1;
struct SLight
{
vec3 Pos;
vec3 Dir;
vec3 Color;
vec4 AttenCutoffExp;
};
uniform SLight g_Lights[g_NumLights];
//...
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:
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)
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:
uniformvec4 mayArrayUniform[4];
und in Delphi:
Code:
// Das glGetString() sollte man natürlich nur einmal beim Programmstart aufrufen
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
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)
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...
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
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)
Mitglieder in diesem Forum: 0 Mitglieder und 44 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.