OpenGL颜色混合函数所遇到的问题
因为项目涉及到多个半透明图层的合并,需要使用到glBlendFunc进行颜色混合
http://www.cppblog.com/wc250en007/archive/2012/07/18/184088.html
参考上面的博客,对该函数有很详细的讲解
我简单整理一下该函数的使用
glEnable(GL_BLEND); 启用opengl颜色混合, 如果要使得glBlendFunc生效,需 要调用该函数
glDisable(GL_BLEND); 禁用opengl颜色混合
void glBlendFunc(GLenum sfactor,GLenum dfactor);
参数sfactor为源因子
参数dfactor为目标因子
使用这个函数后,在最终绘制的时候, opengl就会将原来的颜色目标因子 + 将要绘制的颜色源因子 所得的结果,就是混合后的颜色
可设置的参数
GL_ZERO: 表示使用0.0作为因子,实际上相当于不使用这种颜色参与混合运算。
GL_ONE: 表示使用1.0作为因子,实际上相当于完全的使用了这种颜色参与混合运算。
GL_SRC_ALPHA:表示使用源颜色的alpha值来作为因子。
GL_DST_ALPHA:表示使用目标颜色的alpha值来作为因子。
GL_ONE_MINUS_SRC_ALPHA:表示用1.0减去源颜色的alpha值来作为因子。
GL_ONE_MINUS_DST_ALPHA:表示用1.0减去目标颜色的alpha值来作为因子。
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
刚开始使用以上的参数组合,发现个问题,就是在绘制一张半透明图片的时候,在经过绘制后,颜色变得越来越淡,最后发现是颜色预乘Premultiplied Alpha的问题
也就是实际加载一张图片纹理的时候,各个像素rgb的值都会被乘以alpha, 所以本身加载的图片颜色已经变淡了。
解决办法是使用glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 这个组合
因为我的项目需要将绘制在缓冲区的rgb颜色读取出来,不带a通道,因此我需要在shader中,将返回的rgb各个分量乘以alpha,如下
vec4(rgba.rrgba.a, rgba.grgba.a, rgba.b*rgba.a, 1.0),
这样最后就可以舍弃a通道