我有一个 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)。我怎样才能做到这一点?
OpenGL newbie
问问题
4245 次
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 回答