创建;“工会”;OpenGL中两幅掩模图像的绘制
对于当前2D项目,我正在渲染场景中的不同对象。 在此基础上,我渲染具有剪切部分的图像,例如黑色图像上的透明圆。移动剪切圆时,这会产生一种效果,即,当然,只有在透明部分内,背景对象才可见 现在,我想添加第二个具有不同透明形状的遮罩层,并创建这两个层的并集,显示每个透明部分下面的背景图像 下图显示了一个示例说明: 背景对象 掩蔽图像1 掩蔽图像2 期望结果 对于渲染,我使用libgdx和opengl2.0以及scene2d作为scenegraph。基本上,背景对象作为演员添加到舞台上,然后再添加另一组对象来渲染遮罩 现在我尝试在渲染遮罩时设置混合函数,但我不知道是否可以“联合”每个遮罩的alpha值。但这有可能吗 我已经考虑过使用模具缓冲区,但我还不能让它工作。如果有人能给我一个如何达到这个效果的方法,我将不胜感激。此外,使用模具缓冲区会导致边缘被切碎,因为遮罩为0或1,对吗?一种可能的方法是使用“渲染到纹理”和手动合成。我说的是“潜力”,因为这里几乎没有最好的方法。使用内置混合模式当然可以获得一些性能提升,但它限制了您使用提供的混合功能参数。当然,将遮罩渲染到帧缓冲区alpha通道,然后将其与创建;“工会”;OpenGL中两幅掩模图像的绘制,opengl,libgdx,blending,stencil-buffer,Opengl,Libgdx,Blending,Stencil Buffer,对于当前2D项目,我正在渲染场景中的不同对象。 在此基础上,我渲染具有剪切部分的图像,例如黑色图像上的透明圆。移动剪切圆时,这会产生一种效果,即,当然,只有在透明部分内,背景对象才可见 现在,我想添加第二个具有不同透明形状的遮罩层,并创建这两个层的并集,显示每个透明部分下面的背景图像 下图显示了一个示例说明: 背景对象 掩蔽图像1 掩蔽图像2 期望结果 对于渲染,我使用libgdx和opengl2.0以及scene2d作为scenegraph。基本上,背景对象作为演员添加到舞台上,然后再
GL_DST_alpha/GL_ONE_减数_DST_alpha
一起使用是可行的,但一旦布局变得更复杂,它就会变得棘手
“渲染到纹理”(Render to texture,OTOH)没有这样的缺点。您可以控制整个合成功能,并可以自由地进行任何处理。详细说明一下,渲染的工作原理如下:
- 为对象设置纹理,并向其渲染对象
- 为遮罩设置纹理-例如,一个通道8位。将渲染重定目标到它,并使用输出遮罩值的着色器渲染遮罩
- 如果要添加另一个遮罩,可以将更多内容渲染到同一遮罩纹理,也可以创建另一个遮罩纹理
- 至关重要的是,上述操作的顺序并不重要,因为它们是完全独立的,不会相互影响;事实上,如果遮罩没有更改,您甚至不需要重新渲染它
- 使用合成着色器渲染全屏四边形,将这两种纹理作为输入(制服)
如果您决定坚持使用内置的混合,它会变得有点棘手。通常,您希望alpha 0为“无图像”,1为“所有图像”,但在这种情况下,最好将其视为掩码,其中0为“无掩码”,1为“完整掩码”。然后,遮罩的混合函数可以是
GL_ONE/GL_ONE
,最终图像的混合函数可以是GL_ZERO/GL_ONE\u-DST\u ALPHA
。这当然限制了你同时进行混合和掩蔽的能力
存在一个名为glBlendFuncSeparate
的函数,该函数可能会使它更灵活一些,但它仍然不能像上面提到的方法那样为您提供更多的可能性
或者,实际学习如何设置模具缓冲区将解决该特定问题,因为模具缓冲区是专门为这种用途设计的。网上有很多教程,但基本上它相当于对
glStencil(Op | Func | Mask)
的一些调用,可以选择使用glColorMask
禁用对颜色缓冲区的写入,据我所知,Stencil有一个完整的字节,所以它可以是1到255。但在你的情况下,我会说你应该尝试直接用着色器绘制这个。如果这是不可能的,那么我会说,首先尝试绘制alpha通道。您可以使用glColorMask(0,0,0,1)
禁用颜色,然后在其中绘制形状。接下来,使用目标alphaglBlendFunc(GL_DST_alpha,GL_ONE_减_DST_alpha)
绘制图像混合。因此,您将只将遮罩形状渲染到颜色遮罩中的alpha通道,以便在圆内,alpha遮罩是不透明的,而外部是透明的?然后是它上面的形状,但是alpha通道只会显示遮罩圆圈内的部分?没错。它看起来确实像你要做的。