GLSL for-Schleife array-index
Ich habe einige Schwierigkeiten, die mit Variablen Indizes in GLSL.
Die folgenden GLSL-code ist in Ordnung, die auf NVidia-Karten. Aber es funktioniert nicht auf meinem Intel-HD-4000:
for(int i=0;i<int(uLightCount);++i)
{
vec3 lightPos = uLightsPos[i];
....
}
Gibt es keine Shader-Compiler-Fehler. Das Programm einfach abstürzt, auf glUseProgram
Wie kann ich dieses Problem beheben?
Edit:
uLightCount
und uLightsPos
sind Uniformen:
#define MAX_LIGHTS 10
uniform float uLightCount;
uniform vec3 uLightsPos[MAX_LIGHTS];
Edit 2:
Ich habe einen seltsamen workaround:
#define i0 0
#define i1 1
#define i2 2
...
for(int i=0;i<int(uLightCount);++i)
{
vec3 lightPos;
if (i==i0)
lightPos = uLightsPos[i0];
if (i==i1)
lightPos = uLightsPos[i1];
....
}
Jede Idee, warum das funktioniert?
Vielleicht sollten Sie prüfen, welche shader-Modell unterstützt wird, der durch die Intel-Karten?In der Regel sind diese onboard-Karten unterstützen sehr alte OpenGL und GLSL-Implementierungen
mit der neuesten bootcamp-Treiber (auf meinem MacBook Air) OpenGL 4.0 unterstützt wird
Versuchte zu Lesen, glGetError() ?
Ja aber kein Fehler. Ich habe einen Fehler-check nach jedem gl-rufen.
Versuchen Sie, die Aktualisierung von Treibern auf dem neuesten 15: 33 Uhr version.
mit der neuesten bootcamp-Treiber (auf meinem MacBook Air) OpenGL 4.0 unterstützt wird
Versuchte zu Lesen, glGetError() ?
Ja aber kein Fehler. Ich habe einen Fehler-check nach jedem gl-rufen.
Versuchen Sie, die Aktualisierung von Treibern auf dem neuesten 15: 33 Uhr version.
InformationsquelleAutor Bastl | 2013-04-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Muss der index konstant sein. Das ist, warum Ihr Problemumgehung funktioniert.
Es ist also nicht möglich zu schreiben, dass
glUseProgram
sollte nicht Abstürzen. Dies war ein Treiber Fehler.Sollte ich zu qualifizieren, die oben genannten, indem Sie sagen auch, dass in vielen Fällen unrolling loops durch die Versorgung mit compile-Zeit-Konstanten wie in der Antwort zulassen, kann der compiler, um viele Optimierungen.
hmm, ich hatte dieses Problem vor kurzem mit GLSL auf WebGL. Nicht ein Absturz, aber die shader-Kompilierung fehlgeschlagen. Eigentlich ist mein code war eher so, dass (und vielleicht können Sie mir einen Rat):
void func () { for(int i=0;i<10;++i) { func2 (i); }}
void func2 (int index) { float value = myArray [index]; ... }
aah ja, du hast Recht, webgl ist ziemlich eingeschränkt. in diesem Fall mit dynamische Indizierung. Ein Muster wie
for (int i = 0; i < n && i < MAX_N; ++i)
gibt eine dynamische gebunden und erlaubt es dem compiler zu entrollen (geschachtelte if-Anweisungen). Noch, verschiedene Fahrer/der glsl-compiler verwechselt werden können leicht, und manchmal ist es besser, nur Rollen Sie Sie manuell. Makros wirklich helfen.Diese Antwort ist falsch. Schleife über ein uniform-array möglich war, sogar zurück in GLSL 1.20, geschweige denn 4.x+. Die OP ist eindeutig die Begegnung mit einem Treiber-bug.
InformationsquelleAutor Dave