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:
Die Ausgabe dieses Codestücks ist:
Der Shader sieht so aus:
Weshalb gibt glUniformLocation immer -1 zurück?
Vielen Dank!
Gruss
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:
Java:
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);
Code:
3 (ShaderProgram)
-1 (uniform location)
-1 (uniform location)
-1 (uniform location)
-1 (uniform location)
-1 (uniform location)
-1 (uniform location)
Code:
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);
}
Vielen Dank!
Gruss