GLES20.glUniform4fv给出了GL_INVALID_OPERATION(1282)

Lee*_*ton 3 android opengl-es-2.0

我在将一小部分vec4s向上传到GPU 时遇到了一些问题.我把这个问题煮到了最小的代码来抛出错误.

这是我的片段着色器:

precision mediump float;
uniform vec4 test[5];
void main() {
    gl_FragColor = test[0]+test[1]+test[2]+test[3]+test[4];
}
Run Code Online (Sandbox Code Playgroud)

顶点着色器很简单:

attribute vec4 vPosition;        
void main(){
    gl_Position = vPosition;
}
Run Code Online (Sandbox Code Playgroud)

以下是尝试上传vec4矢量的代码:

    float[] testBuffer = new float[4*5];
    // Fill with 1/5s for now
    Arrays.fill(testBuffer, 0.2f);

    // Get the location
    int testLoc = GLES20.glGetUniformLocation(mProgram, "test");
    checkGlError("glGetUniformLocation test");

    // Upload the buffer
    GLES20.glUniform4fv(testLoc, 5, testBuffer, 0);
    checkGlError("glUniform4fv testBuffer");
Run Code Online (Sandbox Code Playgroud)

第二次调用时发现错误checkGlError(),错误代码为GL_INVALID_OPERATION.

我已经阅读了关于glUniform的文档,所有的大小和类型看起来都是正确的.testLoc是一个有效的位置句柄,上传片段和顶点着色器代码时没有错误.

我只是看不出我做错了什么!有任何想法吗?

- 更新

Chr*_*ica 7

glUniform文档:

如果没有当前程序对象,则生成GL_INVALID_OPERATION

确保调用时当前绑定/使用着色器glUniform(glUseProgram已使用相应的着色器程序句柄调用).在取消绑定着色器(例如glUseProgram(0))时,均匀值保持其值,但在设置统一值时程序必须处于活动状态.