GLES20.glUniform4fv дает GL_INVALID_OPERATION (1282) - PullRequest
3 голосов
/ 01 марта 2012

У меня проблемы с загрузкой небольшого вектора 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 является допустимым дескриптором местоположения, и у меня нет ошибок при загрузке фрагмента и кода вершинного шейдера.

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

- ОБНОВЛЕНО

1 Ответ

7 голосов
/ 01 марта 2012

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

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

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

...