Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建;“工会”;OpenGL中两幅掩模图像的绘制_Opengl_Libgdx_Blending_Stencil Buffer - Fatal编程技术网

创建;“工会”;OpenGL中两幅掩模图像的绘制

创建;“工会”;OpenGL中两幅掩模图像的绘制,opengl,libgdx,blending,stencil-buffer,Opengl,Libgdx,Blending,Stencil Buffer,对于当前2D项目,我正在渲染场景中的不同对象。 在此基础上,我渲染具有剪切部分的图像,例如黑色图像上的透明圆。移动剪切圆时,这会产生一种效果,即,当然,只有在透明部分内,背景对象才可见 现在,我想添加第二个具有不同透明形状的遮罩层,并创建这两个层的并集,显示每个透明部分下面的背景图像 下图显示了一个示例说明: 背景对象 掩蔽图像1 掩蔽图像2 期望结果 对于渲染,我使用libgdx和opengl2.0以及scene2d作为scenegraph。基本上,背景对象作为演员添加到舞台上,然后再

对于当前2D项目,我正在渲染场景中的不同对象。 在此基础上,我渲染具有剪切部分的图像,例如黑色图像上的透明圆。移动剪切圆时,这会产生一种效果,即,当然,只有在透明部分内,背景对象才可见

现在,我想添加第二个具有不同透明形状的遮罩层,并创建这两个层的并集,显示每个透明部分下面的背景图像

下图显示了一个示例说明:

背景对象

掩蔽图像1

掩蔽图像2

期望结果

对于渲染,我使用libgdx和opengl2.0以及scene2d作为scenegraph。基本上,背景对象作为演员添加到舞台上,然后再添加另一组对象来渲染遮罩

现在我尝试在渲染遮罩时设置混合函数,但我不知道是否可以“联合”每个遮罩的alpha值。但这有可能吗

我已经考虑过使用模具缓冲区,但我还不能让它工作。如果有人能给我一个如何达到这个效果的方法,我将不胜感激。此外,使用模具缓冲区会导致边缘被切碎,因为遮罩为0或1,对吗?

一种可能的方法是使用“渲染到纹理”和手动合成。我说的是“潜力”,因为这里几乎没有最好的方法。使用内置混合模式当然可以获得一些性能提升,但它限制了您使用提供的混合功能参数。当然,将遮罩渲染到帧缓冲区alpha通道,然后将其与
GL_DST_alpha/GL_ONE_减数_DST_alpha
一起使用是可行的,但一旦布局变得更复杂,它就会变得棘手

“渲染到纹理”(Render to texture,OTOH)没有这样的缺点。您可以控制整个合成功能,并可以自由地进行任何处理。详细说明一下,渲染的工作原理如下:

  • 为对象设置纹理,并向其渲染对象
  • 为遮罩设置纹理-例如,一个通道8位。将渲染重定目标到它,并使用输出遮罩值的着色器渲染遮罩
  • 如果要添加另一个遮罩,可以将更多内容渲染到同一遮罩纹理,也可以创建另一个遮罩纹理
  • 至关重要的是,上述操作的顺序并不重要,因为它们是完全独立的,不会相互影响;事实上,如果遮罩没有更改,您甚至不需要重新渲染它
  • 使用合成着色器渲染全屏四边形,将这两种纹理作为输入(制服)
总之,“渲染到纹理”(render to texture)在合成操作方面更加灵活,为您提供了一种执行其他后期效果(如motiong blur)的方法,并在操作顺序上提供了更多的灵活性。OTOH,它对纹理或过程的数量施加了一定的限制,使用了更多的内存(因为您将保留中间纹理,而不是只处理一个帧缓冲区),并且可能会有性能损失


如果您决定坚持使用内置的混合,它会变得有点棘手。通常,您希望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)
禁用颜色,然后在其中绘制形状。接下来,使用目标alpha
glBlendFunc(GL_DST_alpha,GL_ONE_减_DST_alpha)
绘制图像混合。因此,您将只将遮罩形状渲染到颜色遮罩中的alpha通道,以便在圆内,alpha遮罩是不透明的,而外部是透明的?然后是它上面的形状,但是alpha通道只会显示遮罩圆圈内的部分?没错。它看起来确实像你要做的。