Я пытаюсь отобразить очень простую вещь (по крайней мере, я так думал) с помощью OpenGL ES 2.0 на Android: монохромный четырехугольник с прозрачностью. Мой фрагментный шейдер в основном просто делает это:
gl_FragColor = vec4(1.0, 0.0, 0.0, 0.5);
Таким образом, четырехугольник должен отображаться чисто красным, но с 50% прозрачностью, чтобы фон (черный) проступал, что должно сделать его немного темнее. Однако у четырехугольника будет точно такой же вид, независимо от того, какое значение я выберу для элемента альфа-канала в векторе. Даже если я установлю альфу на 0,0, она будет отображаться чистым красным цветом.
Я включил GL_BLEND. Вот мои инициализации:
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
GLES20.glDisable(GLES20.GL_DEPTH_TEST);
GLES20.glDisable(GLES20.GL_CULL_FACE);
GLES20.glEnable(GLES20.GL_TEXTURE_2D);
GLES20.glEnable(GLES20.GL_BLEND);
GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA);
Функция рисования настолько проста, насколько это возможно:
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
shader.use(); // will select the vertex and fragment shader
GLES20.glViewport(0, 0, resX, resY); // sets the viewport to the current resolution
GLES20.glEnableVertexAttribArray(v_aPosId);
GLES20.glVertexAttribPointer(v_aPosId, COORDS_PER_VERTEX,
GLES20.GL_FLOAT, false,
0, vertexBuf);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, vertexCount);
GLES20.glDisableVertexAttribArray(v_aPosId);
Вид поверхности создается следующим образом:
glView = new GLSurfaceView(this);
glView.setEGLContextClientVersion(2);
glView.setRenderer(new GLRenderer(this));
Почему альфа-канал просто игнорируется? Я пропустил что-то включить или выключить? Используемое оборудование: Google Nexus 10 с Android 4.2.1.
Редактировать: когда я использовал glReadPixels()
для чтения кадрового буфера, значения пикселей RGBA также были 255, 0, 0, 255
, а не 255, 0, 0, 127
, как должно быть. Однако я исправил это. Если вы хотите правильно отображать прозрачность, см. ответ @martijn-courteaux. Если вы хотите вернуть правильные значения пикселей (как через glReadPixels()
), см. мой ответ.