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通道

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 用一个生活中的例子来介绍什么是颜色混合。 我们拿两块透明有色玻璃叠在一起,透过两块玻璃可以发现叠加的颜色跟两种颜色...
    爱闹的凡阅读 919评论 0 0
  • 颜色混合定义 颜色混合顾名思义就是讲两种颜色混合在一起以展现不同的效果,通过混合的方式展现出最新得到的颜色,以此来...
    离歌欢笑_4c54阅读 1,395评论 0 0
  • 混合 当开启深度测试后,两个重叠的图层中,如果有一个图层是半透明的,另一个是非半透明,此时就不能通过深度值比较,来...
    Pufus阅读 417评论 0 0
  • 什么是颜色混合? 定义:我们把OpenGL在渲染时把颜色值存放在颜色缓冲区中,把每个片段(像素)的深度值存放在深度...
    iOS_沧海一笑阅读 564评论 0 0
  • 一、原因 那么如果开启深度测试后.但是2个重叠的图层中, 有⼀个图层是半透明的. 有⼀个图层是⾮半透明的. 那么此...
    含笑州阅读 837评论 0 1