我正在使用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。
使用以下混合功能:
画笔绘画:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
擦除绘画:
glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA);
我得到了这个效果,显然不是我想要的。我已经尝试了我在SO上发现的glBlenFunc的每个推荐组合,没有任何东西给了我想要的结果。我错过了什么?
答案 0 :(得分:1)
修复方法是使用混合功能GL_ZERO,GL_ONE_MINUS_SRC_ALPHA。我将画笔绘制和擦除笔划渲染到纹理,然后将该纹理渲染到我的帧缓冲区。白色轮廓的修复是将我的第一个渲染渲染设置为glClearColor(0,0,0,1)