1

我的程序中多次绘制纹理时遇到问题。

混合模式是

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));
}

模拟器上的结果: 在此处输入图像描述

设备上的结果: 在此处输入图像描述

4

2 回答 2

0

经过一些实验,我了解到,这个问题出在 device 的支持精度上。所以在 iPad Air 上这个问题出现的次数比在 iPad 4、3 上要少。

于 2014-07-11T11:55:16.520 回答
0

我试图理解你的方法,所以我写下了一些方程式:

这是执行新绘图的方式(如果没有犯任何错误):

color = {pencil_shape}*sourceAlpha + {old_paint}*(1-sourceAlpha)
alpha = {pencil_shape} + {old_paint}*(1-sourceAlpha)

所以基本上你的 alpha 在每一帧上都越来越接近 1,并且你的颜色每次都根据 *pencil_shape* 中的 src alpha 进行混合。

问题:

  • 您是否打算将输出图像中的 alpha 用于任何用途?
  • 你的 *pencil_shape* 全黑 (0, 0, 0, 0) 吗?(除了我认为它有一些抗锯齿效果的角)
于 2013-05-15T09:37:00.197 回答