GLES20.glUniform4fv дает GL_INVALID_OPERATION (1282)

У меня возникли проблемы с загрузкой небольшого вектора vec4 s в графический процессор. Я переварил эту проблему до минимального кода, чтобы выбросить ошибку.

Вот мой шейдер Фрагмента:

 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.

Я прочитал документацию по glUniform, и все размеры и типы выглядят правильно. testLoc является допустимым дескриптором местоположения, и у меня нет ошибок при загрузке фрагмента и вершинного шейдерного кода.

Я просто не вижу, что я делаю неправильно! Есть идеи?

–UPDATED

См. Документацию glUniform :

GL_INVALID_OPERATION генерируется, если нет текущего объекта программы

Убедитесь, что ваш шейдер в настоящее время связан / используется при вызове glUniform ( glUseProgram был вызван с помощью дескриптора соответствующей шейдерной программы). glUseProgram(0) сохраняет свое значение при развязывании шейдера (например, glUseProgram(0) ), но программа должна быть активной при установке равномерного значения.