# JOGL: glUniformLocation gibt immer -1 zurück



## Runtime (11. Jun 2011)

Hallo Leute,

ich hab mir mit Shader Designer einen Fragmentshader programmiert, der einen radialGradient berechnen soll und es im Shader Designer auch tut. Sobald ich ihn aber in Java benutzen möchte, gibt mir das Program einen invalid Operation Error an. Nun habe ich in der Methode die die uniform Variablen setzt ein paar Debugzeilen ausgeben lassen:

```
int shaderProgram = getShaderProgram();
        System.out.println(shaderProgram);
        GL2 gl = (GL2) GLU.getCurrentGL();
        int len = gl.glGetUniformLocation(shaderProgram, "numPoints");
        int stop = gl.glGetUniformLocation(shaderProgram, "stops");
        int cols = gl.glGetUniformLocation(shaderProgram, "colors");
        int a = gl.glGetUniformLocation(shaderProgram, "a");
        int b = gl.glGetUniformLocation(shaderProgram, "b");
        int cyc = gl.glGetUniformLocation(shaderProgram, "cyclic");
        
        System.out.println(stop);
        System.out.println(cyc);
        System.out.println(cols);
        System.out.println(a);
        System.out.println(b);
        System.out.println(len);

        float[] colorVec = new float[colors.length * 4];
        for (int i = 0; i < colorVec.length / 4; i++) {
            colorVec[i] = (float) colors[i].getRed();
            colorVec[i + 1] = (float) colors[i].getGreen();
            colorVec[i + 2] = (float) colors[i].getBlue();
            colorVec[i + 3] = (float) colors[i].getAlpha();
        }

        gl.glUniform1i(len, stops.length);
        gl.glUniform1i(cyc, cyclic ? 1 : 0);
        gl.glUniform4fv(cols, colors.length, colorVec, 0);
        gl.glUniform1fv(stop, stops.length, stops, 0);
        gl.glUniform2f(a, x1, y1);
        gl.glUniform2f(b, x2, y2);
```
Die Ausgabe dieses Codestücks ist:

```
3 (ShaderProgram)
-1 (uniform location)
-1 (uniform location)
-1 (uniform location)
-1 (uniform location)
-1 (uniform location)
-1 (uniform location)
```
Der Shader sieht so aus:

```
uniform int numPoints;
uniform float stops[20];
uniform vec4 colors[20];
uniform vec2 a;
uniform vec2 b;
uniform bool cyclic;

vec4 getColorByPosition(float pos);

void main(void)
{
    float dxl = b.x - a.x;
    float dyl = b.y - a.y;
    float l = sqrt(dxl * dxl + dyl * dyl);

    float dx = a.x - gl_FragCoord.x;
    float dy = a.y - gl_FragCoord.y;
    float length = sqrt(dx * dx + dy * dy);

    if(cyclic) {
        float pos = mod((1.0 / l * length), 1.0);
        gl_FragColor = getColorByPosition(pos);
    } else {
        float pos = 1.0 / l * length;
        if(pos >= 1.0) {
            gl_FragColor = colors[numPoints - 1];
        } else {
            gl_FragColor = getColorByPosition(pos);
        }
    }
}

vec4 getColorByPosition(float pos) {
    int index;
    for(int i = 0; i < numPoints; i++) {
        if(pos < stops[i]) {
            index = i;
            break;
        }
    }
    
    float p = pos - stops[index - 1];
    float length = stops[index] - stops[index - 1];
    
    float factor = 1.0 / length * p;
    vec4 prevColor = colors[index - 1];

    float dr = colors[index].r - prevColor.r;
    float dg = colors[index].g - prevColor.g;
    float db = colors[index].b - prevColor.b;
    float da = colors[index].a - prevColor.a;
    
    return vec4(prevColor.r + factor * dr, prevColor.g + factor * dg,
        prevColor.b + factor * db, prevColor.a + factor * da);
}
```
Weshalb gibt glUniformLocation immer -1 zurück?
Vielen Dank!
Gruss


----------



## Marco13 (11. Jun 2011)

Ist der Shader zu diesem Zeitpunkt schon fehlerfrei compiliert und gelinkt? Ich meine, das muss vorher passieren...


----------



## Runtime (11. Jun 2011)

Habs endlich geschafft einen Log auszugeben:

```
ERROR: 0:9: 'numPoints' : undeclared identifier 
ERROR: 0:9: '<' :  wrong operand types  no operation '<' exists that takes a left-hand operand of type 'int' and a right operand of type 'float' (or there is no acceptable conversion)
ERROR: 0:48: 'numPoints' : undeclared identifier 
ERROR: 0:48: '-' :  wrong operand types  no operation '-' exists that takes a left-hand operand of type 'float' and a right operand of type 'const int' (or there is no acceptable conversion)
ERROR: 0:48: '[]' : integer expression required
```
Aber ich finde irgendwie keinen Fehler, siehst du einen? Und im Shader Designer ist er auch korrekt. :autsch:



Marco13 hat gesagt.:


> Ist der Shader zu diesem Zeitpunkt schon fehlerfrei compiliert und gelinkt? Ich meine, das muss vorher passieren...


Wenn das programm noch nicht geladen wurde hat program nicht den Wert 3.


----------



## Runtime (11. Jun 2011)

Ok, Problem gelöst. Die Ressource wird aus der Jar geladen, die ich zuerst neu erstellen musste, es war noch eine alte Fehlerhafte Version darin. Und ich hab daran 5 Stunden verbraten :cry:


----------



## Marco13 (11. Jun 2011)

Naja, offenbar ist ja irgendwas falsch - wie 'program' zu seinem Wert 3 kommt, sei mal dahingestellt... Ich bin auch nicht so der Shader-Experte, dass ich durch draufschauen wüßte, was da falsch ist (ehrlich gesagt habe ich nachgesehen, ob das mit den uniform arrays und Unterfunktionen so OK ist ... aber auf die Schnelle nichts gefunden, was dagegen spricht). 

Sollten die 9 und 48 nicht Zeilennummern sein? Irgendwie passen die da ja nicht ???:L Kannst du die mal "matchen"?

Tststs... wo ist Fancy wenn man ihn mal braucht? ;( 

EDIT: Ah, knapp...


----------

