У меня проблема с множественной отрисовкой текстур в моей программе.
Режим наложения
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glBlendEquation(GL_FUNC_ADD);
Значение a-channel передается в шейдер из cpu-code.
precision highp float;
uniform sampler2D tShape;
uniform vec4 vColor;
uniform float sOpacity;
varying vec4 texCoords;\n"
void main() {
float a = texture2D(tShape, texCoords.xy).x * sOpacity;
gl_FragColor = vec4(vColor.rgb, a);
}
Он рассчитан ранее с
O = pow(O, 1.3);
для лучшего визуального эффекта.
Я рисую цветом (0; 0; 0) на черном прозрачном холсте (0; 0; 0; 0), но с очень низкой непрозрачностью:
0.03 -> 0.01048
0.06 -> 0.0258
0.09 -> 0.0437
0.12 -> 0.0635
...
Я ожидаю, что максимальное значение цвета точки будет (0;0;0;1) (черный, непрозрачный) после многократного рисования как на симуляторе:
но на устройстве это не так:
Есть идеи, почему так?
ОБНОВЛЕНИЕ:
Также некорректно работает ручное смешивание (и с отличием от стандартного).
glBlendFunc(GL_ONE, GL_ZERO);
Код фрагментного шейдера:
#extension GL_EXT_shader_framebuffer_fetch : require
precision highp float;
uniform sampler2D tShape;
uniform vec4 vColor;
uniform float sOpacity;
varying vec4 texCoords;
void main() {
float a = texture2D(tShape, texCoords.xy).x * sOpacity;
gl_FragColor = vec4(vColor.rgb * a, a) + (gl_LastFragData[0] * (1.0 - a));
}
Результат на симуляторе:
Результат на устройстве: