我有一个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)。我怎样才能做到这一点?
答案 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()?它允许您启用/禁用对四种颜色组件中的每一种的写入。