我有一些问题上传一个小向量vec4s到gpu。我已经把这个问题归结为抛出错误的最小代码。
这是我的片段着色器:

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

顶点着色器很简单:
attribute vec4 vPosition;
void main(){
    gl_Position = vPosition;
}

以下是尝试上载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");

在第二次调用checkGlError()时发现错误,错误代码为gl_invalid_operation。
我已经阅读了on glUniform文档,所有的大小和类型似乎都是正确的。testLoc是一个有效的位置句柄,上传片段和顶点着色器代码时没有错误。
我只是看不出我做错了什么!有什么想法吗?
--更新

最佳答案

参见glUniform文档:
如果没有当前程序,则生成gl_invalid_操作
对象
确保在调用glUniform时当前已绑定/使用着色器(已使用相应的着色器程序句柄调用了glUseProgram)。当取消绑定着色器(例如glUseProgram(0))时,统一保持其值,但在设置统一值时,程序必须处于活动状态。

关于android - GLES20.glUniform4fv给出了GL_INVALID_OPERATION(1282),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9517557/

10-09 19:49