OpenGL多纹理遮罩

时间:2012-07-03 11:40:17

标签: objective-c xcode cocoa opengl alphablending

我在this question中找到了@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)函数中实现,这样当坐标改变时(当用户绘制时)可以调用它。我尝试了多种方法来更改代码的顺序,但它无法正常工作。现在我的代码是:

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描述时,它可以正常工作,但是当拖动鼠标时它会绘制一个点并拖动它。在绘制点之后,其他纹理也被重新绘制。对它有任何,至少是类似的解决方案吗?


为了更清楚,我将展示我希望我的APP如何运作。

以下是原始代码:

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);

现在它的工作方式如下:

  1. 绘制背景
  2. 绘制面具
  3. 绘制前景
  4. 我需要它像这样工作:

    1. 绘制免费
    2. 绘制前景
    3. 绘制面具
    4. 但是,如果我改变图纸的顺序,它就会停止工作。忽略面具。

      预期结果照片: enter image description here

1 个答案:

答案 0 :(得分:0)

你最后画面具的尝试没有任何意义。

绘制蒙版仅修改Alpha通道中的内容,并且Alpha通道本身在最终图像中不会以任何方式显示。

掩码的唯一用途是修改后面绘制的内容。