【问题标题】:OpenGL glBlendFuncSeparateOpenGL glBlendFuncSeparate
【发布时间】:2012-07-17 14:37:25
【问题描述】:

我需要一些有关 OpenGL 纹理遮罩的帮助。我让它工作,但需要找到一些其他混合函数参数以其他方式工作。 现在我有:

//Background 
...code...
    glBlendFunc(GL_ONE, GL_ZERO);
...code

//Mask
...code...
    glBlendFuncSeparate(GL_ZERO, GL_ONE, GL_DST_COLOR, GL_ZERO);
...code...

//Foreground
...code
    glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA);
...code

现在它将前景的不透明度设置为 0(用背景纹理填充),其中蒙版是透明的。我需要它对面具的颜色做出反应。我的意思是根据蒙版的颜色设置前景不透明度。例如,如果蒙版是黑色 (0.0,0.0,0.0),则前景中该位置的不透明度为 0(填充背景),如果蒙版为白色(1.0,1.0,1.0),则前景的不透明度为 1(未填充背景)。它可以是相反的结果(白色 = 不透明度 0,黑色 = 不透明度 1)。我只需要它根据颜色工作。

我当前结果的可视化如下。


背景:

面具(圆圈是透明的):

前台:

结果:


我希望它像这样工作:

背景:

面具(圆圈为白色,背景为黑色):

前台:

结果:


以便以后可以这样使用:

背景:

面具(圆圈为白色,背景为黑色):

前台:

结果:


尝试使用@Gigi 解决方案:

【问题讨论】:

  • 你能添加一个“预期”的结果图像吗?
  • 你考虑过使用像素着色器吗?
  • 是的,就像@ananthonline 所说,如果像素着色器是一个选项,那么这个解决方案会相当简单
  • 实际上我不知道如何设置像素着色器并使用它们,这就是我使用混合的原因。它看起来更容易

标签: objective-c xcode macos cocoa opengl


【解决方案1】:

也许这就是你想要的:


1) 清除目标图片:

glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);

2) 绘制背景,屏蔽掉 alpha 通道:

glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE);

3) 绘制“遮罩覆盖”,遮蔽颜色通道:

glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE);

4) 绘制前景,启用混合:

glEnable(GL_BLEND);
glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD);
glBlendFuncSeparate(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_ONE, GL_ZERO);

注意:叠加图像必须指定 Alpha 通道。

【讨论】:

  • 感谢您的回答。现在无论我在哪里绘制蒙版,整个前景都变得完全透明(alpha = 0)。而且我需要它只在蒙版中例如黑色的地方变得透明。
  • @JuliusPetraška:您的蒙版图像需要在圆圈内填充 alpha=0 和在圆圈外填充 alpha=1 的 alpha 通道......就像您发布的蒙版图像一样,但实际“阿尔法通道”。
  • 我知道。我使用了你所描述的图像(圆圈 alpha = 0,外部 alpha = 1。我的蒙版只是小图像,背景和前景很大,所以当我绘制我的蒙版时,它必须只掩盖图像的一小部分。作为它在我的代码的早期变体中确实如此。现在它只是掩盖了所有图像。
  • @JuliusPetraška:你是如何“画”面具的?
  • @JuliusPetraška:确实很奇怪。我怀疑你在其他地方还有其他问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多