我在将vec4
s的小向量上传到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
是一个有效的位置句柄,上传片段和顶点着色器代码时没有错误。
我只是看不出我做错了什么!有什么想法吗?
- 更新
答案 0 :(得分:7)
请参阅glUniform
文档:
如果没有当前程序,则生成GL_INVALID_OPERATION 对象
确保调用glUniform
时已绑定/使用着色器(已使用相应的着色器程序句柄调用glUseProgram
)。在取消绑定着色器时,均匀值保持其值(例如glUseProgram(0)
),但在设置统一值时程序必须处于活动状态。