2

我有一个 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)。我怎样才能做到这一点?

4

2 回答 2

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 函数之一。

如果你不走运,你甚至可能通过调用古怪的函数来进行软件渲染仿真:-)

于 2008-09-28T16:03:13.533 回答
1

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

于 2008-09-28T16:00:21.807 回答