我的程序中多次绘制纹理时遇到问题。
混合模式是
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));
}
模拟器上的结果:
设备上的结果: