我在这个问题中使用了@Stefan Monov 教程。一切正常,但我需要用我的画笔让它工作。我需要这样做:
// Next, we want a blendfunc that doesn't change the color of any pixels,
// but rather replaces the framebuffer alpha values with values based
// on the whiteness of the mask. In other words, if a pixel is white in the mask,
// then the corresponding framebuffer pixel's alpha will be set to 1.
glBlendFuncSeparate(GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ZERO);
// Now "draw" the mask (again, this doesn't produce a visible result, it just
// changes the alpha values in the framebuffer)
drawQuad(maskTexture);
将不是静态纹理,而是动态形状。我的意思是,我正在尝试实现刷子女巫正在做这样的事情,这是由@Stefan Monov 编写的。所以我需要这个地方可以在其他 - (void) 函数中实现,以便在坐标变化时(当用户绘制时)可以调用它。我尝试了多种方法来更改代码的顺序,但它无法正常工作。现在我的 bursh 代码是:
glEnable(GL_BLEND);
glBlendFuncSeparate(GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ZERO);
glPointSize(100);
glBegin(GL_POINTS);
glColorMask(1.0,1.0,1.0, 1.0);
glVertex2f(loc.x, loc.y);
glEnd();
glDisable(GL_BLEND);
鼠标拖动时调用。“loc”是被拖动的鼠标坐标。当然,由于 blendFunc 和代码的顺序,它现在根本不工作。当我按照@Stefan Monov 描述的那样离开序列时,它可以工作,但是它会绘制一个点并在拖动鼠标时拖动它。因为在绘制点之后,其他纹理也在重新绘制。有什么,至少是类似的解决方案吗?
为了更清楚,我将展示我希望我的应用程序如何工作。
这是原始代码:
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ZERO);
drawQuad(backgroundTexture);
glBlendFuncSeparate(GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ZERO);
drawQuad(maskTexture);
glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA);
drawQuad(foregroundTexture);
现在它的工作方式如下:
- 绘制背景
- 绘制蒙版
- 绘制前景
我需要它像这样工作:
- 绘制免费
- 绘制前景
- 绘制蒙版
但是,如果我更改图纸的顺序,它就会停止工作。忽略面具。
预期结果照片: