我有一个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).我怎样才能做到这一点?
您可以将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函数之一.
如果你运气不好,你甚至可以通过调用古怪的函数来结束软件渲染模拟:-)
归档时间: |
|
查看次数: |
4049 次 |
最近记录: |