OpenGL glBlendFuncSeparate

hoc*_*man 6 opengl macos xcode cocoa objective-c

我需要一些有关 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
Run Code Online (Sandbox Code Playgroud)

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

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


背景:
在此处输入图片说明

面具(圆圈是透明的):
在此处输入图片说明

前景:
在此处输入图片说明

结果:
在此处输入图片说明


我希望它像这样工作:

背景:
在此处输入图片说明

面具(圆圈为白色,背景为黑色):
在此处输入图片说明

前景:
在此处输入图片说明

结果:
在此处输入图片说明


这样以后就可以像这样使用它:

背景:
在此处输入图片说明

面具(圆圈为白色,背景为黑色):
在此处输入图片说明

前景:
在此处输入图片说明

结果:
在此处输入图片说明


尝试使用@Gigi 解决方案:
在此处输入图片说明

Gig*_*igi 4

也许这就是您想要的:


1)清除目标图像:

glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
Run Code Online (Sandbox Code Playgroud)

2) 绘制背景,遮盖 Alpha 通道:

glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE);
Run Code Online (Sandbox Code Playgroud)

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

glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE);
Run Code Online (Sandbox Code Playgroud)

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

glEnable(GL_BLEND);
glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD);
glBlendFuncSeparate(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_ONE, GL_ZERO);
Run Code Online (Sandbox Code Playgroud)

注意:覆盖图像必须指定 Alpha 通道。