OpenGL:如何在不更改目标Alpha的情况下进行RGBA-> RGBA闪烁
时间:2020-03-06 14:50:50 来源:igfitidea点击:
我有一个OpenGL RGBA纹理,并使用一个帧缓冲对象在其上涂抹了另一个RGBA纹理。问题是,如果我将常用的混合功能与glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA),
产生的blit会导致目标纹理的alpha发生变化,从而使先前alpha为1的地方稍微透明。 GL_ONE_MINUS_SRC_ALPHA。因此,混合因子函数应为(As,As,As,0)和(1-As,1-As,1-As,1)。我该如何实现?
解决方案
也许我们可以使用glColorMask()?它使我们可以启用/禁用对四个颜色分量中的每一个的写入。
我们可以将RGB和alpha的混合模式设置为不同的方程式:
void glBlendFuncSeparate( GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
在情况下,我们想使用以下枚举:
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE);
请注意,我们可能必须将glBlendFuncSeparate函数作为扩展导入。这样做是安全的。该功能已存在很长时间了。它是OpenGL 1.4的一部分
另一种方法是使用glColorMask禁用对alpha通道的写入:
void glColorMask( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha )
它可能比glBlendFuncSeparate慢很多,因为OpenGL驱动程序优化了最常用的函数,而glColorMask是很少使用的OpenGL函数之一。
如果我们不走运,甚至可以通过调用奇数球函数来最终实现软件渲染仿真:-)