https://img-blog.csdnimg.cn/32db9ce43ef64316a2e37a31f4cee033.gif
编程小鱼酱yu612.com,点击前往

Opengl es2.0 学习笔记(九)颜色混合

一.不启用的效果

 //需要传入GL_RGBA
 fmt     =   GL_RGBA;
        glTexImage2D( 
                GL_TEXTURE_2D,      //! 指定是二维图片
                0,                  //! 指定为第一级别,纹理可以做mipmap,即lod,离近的就采用级别大的,远则使用较小的纹理
                fmt,                //! 纹理的使用的存储格式
                width,              //! 宽度,老一点的显卡,不支持不规则的纹理,即宽度和高度不是2^n。
                height,             //! 宽度,老一点的显卡,不支持不规则的纹理,即宽度和高度不是2^n。
                0,                  //! 是否的边
                fmt,                //! 数据的格式,bmp中,windows,操作系统中存储的数据是bgr格式
                GL_UNSIGNED_BYTE,   //! 数据是8bit数据
                pixels
                );

当我们调用函数去画纹理时候

修改像素shader,丢弃a值 小于0.2的像素

            "precision  lowp float; "
            "uniform    sampler2D   _texture;\n"
            "varying    vec4        _outColor;\n"
            "varying    vec2        _outUV;"
            "void main()"
            "{"
            "   vec4   color   =   texture2D(_texture,_outUV);"
            "   if(color.a < 0.2)"
            "       discard;"
            "   gl_FragColor   =   color * _outColor;"
            "}"

如此绘制,看到我们的边缘特别生硬。

二、开启混合

我们可以使用混合,让它软化,然它开起来自然。混合是在片元操作里发生的。

要使用OpenGL的混合功能,只需要调用:glEnable(GL_BLEND);即可。
要关闭OpenGL的混合功能,只需要调用:glDisable(GL_BLEND);即可。

   glEnable(GL_BLEND);

	//最小a值运算
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 //在OpenGL中,默认是没有开启深度检测的,也就是说,后绘制的
 //物体覆盖先绘制的物体(颜色缓冲区中,先绘制的物体 被 后绘制的物体 覆盖)。
   glEnable(GL_DEPTH_TEST);

启用深度测试,我们画的东西就会有深度,否则后画的,会把先画的覆盖掉。

三.混合方式

//源因子和目标因子

  • sfactor
    指定红绿蓝和 alpha 源混合因子如何计算。初始值为GL_ONE。 接受了九个符号常量: GL_ONE_MINUS_DST_ALPHA,GL_ZERO GL_ONE,GL_DST_COLOR GL_ONE_MINUS_DST_COLOR,GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA,GL_DST_ALPHA 和 GL_SRC_ALPHA_SATURATE。
  • dfactor
    指定红绿蓝和 alpha 目标混合因子如何计算。初始值为GL_ZERO。 接受了八个符号常量: GL_ZERO GL_ONE,GL_SRC_COLOR GL_ONE_MINUS_SRC_COLOR,GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA,GL_DST_ALPHA,和 GL_ONE_MINUS_DST_ALPHA。
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

参数详细说明:

  • 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值来作为因子。

四.举例:

1)您还可以使用 glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ),其对于以任意顺序渲染反锯齿点和线也是非常有用的。

2)若要优化的多边形消除锯齿,可使用从最远到最近存储多边形的混合函数 glBlendFunc ( GL_SRC_ALPHA_SATURATE, GL_ONE )。 目的 alpha 位平面存储累积的覆盖,必须使用这个平面以使这个混合函数正确进行操作。

3)如果设置了glBlendFunc(GL_ONE, GL_ZERO);,则表示完全使用源颜色,完全不使用目标颜色,因此画面效果和不使用混合的时候一致(当然效率可能会低一点点)。如果没有设置源因子和目标因子,则默认情况就是这样的设置。

4)如果设置了glBlendFunc(GL_ZERO, GL_ONE);,则表示完全不使用源颜色,因此无论你想画什么,最后都不会被画上去了。(但这并不是说这样设置就没有用,有些时候可能有特殊用途)
如 果设置了glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);,则表示源颜色乘以自身的alpha 值,目标颜色乘以1.0减去源颜色的alpha值,这样一来,源颜色的alpha值越大,则产生的新颜色中源颜色所占比例就越大,而目标颜色所占比例则减 小。这种情况下,我们可以简单的将源颜色的alpha值理解为“不透明度”。这也是混合时最常用的方式。
如果设置了glBlendFunc(GL_ONE, GL_ONE);,则表示完全使用源颜色和目标颜色,最终的颜色实际上就是两种颜色的简单相加。例如红色(1, 0, 0)和绿色(0, 1, 0)相加得到(1, 1, 0),结果为黄色。

posted @ 2018-11-16 08:29  鱼酱  阅读(243)  评论(0编辑  收藏  举报

https://img-blog.csdnimg.cn/32db9ce43ef64316a2e37a31f4cee033.gif
编程小鱼酱yu612.com,点击前往