使用纹理更改帧部分的Alpha值

时间:2015-03-10 15:28:35

标签: opengl glsl

我正在使用OpenGL制作2D绘画应用程序。正如其他人对堆栈溢出一样,我正在努力的部分是橡皮擦功能。这是一个使用OpenGL 3.2的OS X应用程序。

其他人建议使用我已经实现的模板缓冲区。但是,据我所知,模板缓冲区是一个硬掩码 - 无论是通过还是失败 - 没有处理alpha级别的能力。如果我错了,请纠正我。

通过沿点的路径应用纹理来创建绘画描边。我刷子的片段着色器看起来像这样。我正在为黑色和黑色应用一种颜色。 alpha画笔纹理。

uniform sampler2D tex;
uniform vec4 color;
out vec4 outColor;

void main() {
    outColor = mix( vec4(color.rgb,0), vec4(color.rgb,1), texture(tex,gl_PointCoord));
}

在我的理想世界中,橡皮擦只会更新帧的alpha值,根据擦除纹理使像素更不可见。看起来这应该是可以使用glBlendFunc(),但我尝试了一堆组合,没有任何作用。

我的画笔纹理是这样的。这里显示的是灰色背景,但实际的PNG只是黑色和alpha。

Screenshot 1

使用以下混合功能:

画笔绘画:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

擦除绘画:

glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA);

我得到了这个效果,显然不是我想要的。我已经尝试了我在SO上发现的glBlenFunc的每个推荐组合,没有任何东西给了我想要的结果。我错过了什么?

Screenshot 2

1 个答案:

答案 0 :(得分:1)

修复方法是使用混合功能GL_ZERO,GL_ONE_MINUS_SRC_ALPHA。我将画笔绘制和擦除笔划渲染到纹理,然后将该纹理渲染到我的帧缓冲区。白色轮廓的修复是将我的第一个渲染渲染设置为glClearColor(0,0,0,1)