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

时间:2008-09-28 15:55:57

标签: opengl alphablending

我有一个OpenGL RGBA纹理,我使用帧缓冲对象将另一个RGBA纹理加入其中。问题是,如果我使用通常的混合功能 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), 生成的blit会导致目标纹理alpha发生变化,使其对于alpha先前为1的地方略微透明。我希望目标表面alpha永远不会改变,但是对RGB值的影响应该与{{1}完全相同}和GL_SRC_ALPHA。因此,混合因子函数应该是(As,As,As,0)和(1-As,1-As,1-As,1)。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:7)

您可以将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函数之一。

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

答案 1 :(得分:1)

也许你可以使用glColorMask()?它允许您启用/禁用对四种颜色组件中的每一种的写入。