OpenGL减法混合

时间:2013-11-02 18:17:06

标签: ios opengl-es ios7 opengl-es-2.0 blending

在我正在开发的绘画应用程序中,我希望我的用户能够使用透明画笔绘制,例如在白色背景上的黑色涂料应该导致灰色。当涂抹更多涂料时,产生的颜色将更接近黑色。

enter image description here

然而无论我在这个地方画多少次,最终的颜色都不会变黑;实际上它在几行后就停止了变化。 Photoshop说在OpenGL左边绘制的blob的alpha值最大为0.8,我希望它为1.

我的应用程序的工作原理是绘制一系列邮票,就像在Apple的GLPaint样本中一样,形成一条线。邮票与以下功能混合:

glBlendFuncSeparate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA, GL_ONE);
glBlendEquation(GL_FUNC_ADD);

我的片段着色器:

uniform lowp sampler2D u_texture;
varying highp vec4 f_color;

void main(){
    gl_FragColor = texture2D(u_texture, gl_PointCoord).aaaa*f_color*vec4(f_color.aaa, 1);
}

在重复绘制时,如何配置混合以获得全彩色?

2013年7月11日更新

也许我还应该注意,我首先绘制一个纹理,然后在屏幕上绘制纹理。使用以下代码生成纹理:

    glGenFramebuffers(1, &textureFramebuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, textureFramebuffer);

    glGenTextures(1, &drawingTexture);
    glBindTexture(GL_TEXTURE_2D, drawingTexture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,  pixelWidth, pixelHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

更新02/12/2013 我尝试修改Apple的GLPaint程序,结果发现这种行为只能在iOS7上观察到。正如在下面的屏幕截图中可以看到的那样,iOS 7上的颜色有点苍白,并且不能很好地融合。

GL_ONE, GL_ONE_MINUS_SRC_ALPHA

混合功能在iOS6上运行良好。这种行为可能是由iOS7的CALAyer或其他东西的实现引起的,我该如何解决呢?

iOS6 iOS7

2014年10月7日更新

Apple最近为iOS7更新了他们的GLPaint样本,这个问题也在那里可以观察到。我基于他们的代码创建了一个单独的线程:Unmodified iOS7 Apple GLPaint example blending issue

1 个答案:

答案 0 :(得分:1)

仅仅因为你的画笔“变暗”图像并不意味着,这是减色混合。这是面对常规的添加剂混合,其中黑色画笔仅仅是过度绘制图片。您需要(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)混合功能(非分离)。画笔仅包含在纹理的Alpha通道内,纹理中没有颜色通道,画笔颜色由glColor或等效的制服确定。

在大多数情况下,不需要使用目标alpha值。