Index-Ausdruck muss Konstante - WebGL/GLSL Fehler
Ich habe Probleme beim Zugriff auf ein array in einem fragment-shader mit einem nicht-Konstanten int als index. Ich habe entfernt die Formel als würde es nicht viel Sinn hier sowieso nicht, aber mein code ist gedacht, um die Berechnung der tileID basierend auf dem aktuellen pixel und verwenden, um zu bestimmen, die Farbe.
Hier ist mein code:
int tileID = <Insert formula here>;
vec3 colorTest;
int arrayTest[1024];
for (int x = 0; x < 1024; x++) {
if (x == 1) arrayTest[x] = 1;
else arrayTest[x] = 2;
}
if (arrayTest[tileID] == 1) colorTest = vec3(0.0, 1.0, 0.0);
else if (arrayTest[tileID] == 2) colorTest = vec3(1.0, 0.0, 0.0);
else colorTest = vec3(0.0, 0.0, 0.0);
Offenbar GLSL nicht so aus und ich bekomme die Fehlermeldung:
'[]' : Index-Ausdruck muss Konstante
Weiß jemand, wie ich dieses Problem beheben? Danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als hintergrund -- GLSL sieht viel wie C, die Kompilierung ist jedoch ein bisschen anders. Die Dinge sind sehr abgerollt, und Bedingungen können parallel ausgeführt werden, und nun am Ende, diese Art der Sache. Hängt von der hardware...
Können Sie loop-Indizes oder Konstanten index in arrays. Die Zuweisung in der Schleife ist ok, aber der Zugriff von tileID nicht.
WebGL-Shader-Sprache ist aus der GLES, dokumentiert
http://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf
Anhang, Abschnitt 5 diskutiert:
Hoffe, das hilft!
Oh, da für die Festsetzung es, in den exakten Beispiel oben... sieht aus wie könnte man berechnen aus tileID eher als precompute und index.
Oder, vorausberechnen, was Arrays, die Sie mögen, und übergeben Sie es in eine textur. Eine textur, natürlich kann indiziert werden, jedoch, das Sie mögen.
Hier ist ein javascript-helper-Methode, die ich verwenden, um pass Schwimmer nach unten zu den Shadern:
Beachten Sie die Verwendung von gl.NÄCHSTEN, so dass es nicht "verwischen" Ihre Werte! Dann können Sie es einrichten, bevor die gl.drawXxx nennen, mit so etwas wie
Und in den shader (ich glaube, fragment-oder vertex; einige früher webgl ist nicht unterstützt vertex-Texturen...)
So, Sie haben index entsprechend der array-als-textur-Größe, im Bereich von 0 bis 1. Versuchen Sie, die Probe aus der Mitte jedes Wert/pixel. Wie, wenn das array 2 Werte breit, index um 0,25 und 0,75.
Das ist das wesentliche!
Getestet in Safari 9.1.2 auf OS X 10.11.6
'i' : Loop index cannot be compared with non-constant expression
Traf ich diesen Fehler denn ich war versucht, einer integer-variable nehmen, die N-te textur aus einem array von Texturen:
War die Lösung zu brechen, die textur Indizierung in eine Sequenz von konditionalen: