OpenGL:如何在不改变目标alpha的情况下进行RGBA-> RGBA blitting

2 opengl alphablending

我有一个OpenGL RGBA纹理,我使用帧缓冲对象将另一个RGBA纹理加入其中.问题是,如果我使用通常的混合函数与 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), 结果blit导致目标纹理alpha更改,使其略微透明的alpha以前是1的地方.我希望目标表面alpha永远不会改变,但否则效果RGB值应该与GL_SRC_ALPHA和/ 完全一样GL_ONE_MINUS_SRC_ALPHA.因此,混合因子函数应该是(As,As,As,0)和(1-As,1-As,1-As,1).我怎样才能做到这一点?

Nil*_*nck 7

您可以将RGB和alpha的混合模式设置为不同的方程式:

void glBlendFuncSeparate(
    GLenum srcRGB, 
    GLenum dstRGB, 
    GLenum srcAlpha, 
    GLenum dstAlpha);
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您想使用以下枚举:

  glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE);
Run Code Online (Sandbox Code Playgroud)

请注意,您可能必须将glBlendFuncSeparate函数作为扩展名导入.尽管如此,这样做是安全的.这个功能很长一段时间.它是OpenGL 1.4的一部分

另一种方法是使用glColorMask禁止写入alpha通道:

void glColorMask( GLboolean red,
                  GLboolean green,
                  GLboolean blue,
                  GLboolean alpha )
Run Code Online (Sandbox Code Playgroud)

可能比glBlendFuncSeparate慢很多,因为OpenGL驱动程序优化了最常用的函数,glColorMask是很少使用的OpenGL函数之一.

如果你运气不好,你甚至可以通过调用古怪的函数来结束软件渲染模拟:-)

  • 我发现glColorMask()支持通常都很不错. (3认同)