4

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

在此处输入图像描述

但是无论我在这个地方画了多少次,最终的颜色都不会变黑;事实上,它在几行之后就停止了变化。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 实现或其他原因引起的,我该如何解决?

iOS6IOS 7

2014 年 10 月 7 日更新

Apple 最近为 iOS7 更新了他们的 GLPaint 示例,并且在那里也可以观察到这个问题。我根据他们的代码创建了一个单独的线程:未修改的 iOS7 Apple GLPaint 示例混合问题

4

1 回答 1

1

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

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

于 2013-11-02T18:27:17.313 回答