美文网首页
OpenGL颜色混合函数所遇到的问题

OpenGL颜色混合函数所遇到的问题

作者: 3c1b8ae8346c | 来源:发表于2021-08-23 15:05 被阅读0次

因为项目涉及到多个半透明图层的合并,需要使用到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通道

相关文章

  • OpenGL颜色混合函数所遇到的问题

    因为项目涉及到多个半透明图层的合并,需要使用到glBlendFunc进行颜色混合 http://www.cppbl...

  • OpenGL --混合、多重采样

    颜色混合 在OpenGL中使用glEnable(GL_BlEND)来开启颜色混合。目标颜色:已经存储在颜色缓存区的...

  • OpenGL 颜色混合

    我们把OpenGL 渲染时会把颜⾊值存在颜⾊缓存区中,每个⽚段的深度值也是放在深度缓冲区。当深度缓冲区被关闭时,新...

  • OpenGL 颜色混合

    OpenGL 在渲染时, 同一像素以最后一次传入的颜色为最终结果, 显示到屏幕上. 当我们开启深度测试后, 当同一...

  • OpenGL颜色混合

    OpenGL 渲染时会把颜⾊值存在颜⾊缓存区中,每个⽚元的深度值也是放在深度缓冲区。当深度缓冲区被关闭时,新的颜⾊...

  • OpenGL颜色混合

    颜色混合 当深度测试关闭时,新的颜色值简单当覆盖颜色缓冲区中已经存在当其他值。当深度测试打开时,新的颜色片段只有当...

  • OpenGL颜色混合原理

    用一个生活中的例子来介绍什么是颜色混合。 我们拿两块透明有色玻璃叠在一起,透过两块玻璃可以发现叠加的颜色跟两种颜色...

  • OpenGL颜色混合原理

    这就是颜色混合 一。什么情况下会用到颜色混合:1.在固定着色器或者可编程着色器中,开启颜色混合(glEnable(...

  • 三、OpenGL - 颜色混合

    裁剪 在OpenGL 中提⾼渲染的⼀种⽅式.只刷新屏幕上发⽣变化的部分.OpenGL 允许将要进⾏渲染的窗⼝只去指...

  • OpenGL-颜色混合

    在一般情况下,OpenGL在渲染时把颜色值存放在颜色缓冲区中,把每个片段(像素)的深度值存放在深度缓冲区中。当深度...

网友评论

      本文标题:OpenGL颜色混合函数所遇到的问题

      本文链接:https://www.haomeiwen.com/subject/hjcliltx.html