目录
  • 一、混合api
  • 二、参数含义
    • 2.1 举个栗子
    • 2.2 参数含义
  • 三、 几种常用混合方式效果
    • 3.1 混合(gl_one, gl_zero)
    • 3.2 混合(gl_one, gl_one)
    • 3.3 混合(gl_one, gl_one_minus_dst_alpha)
    • 3.4 混合 (gl_src_alpha, gl_one)
    • 3.5 混合 (gl_src_alpha, gl_one_minus_src_alpha)

在opengl中绘制的时候,有时候想使新画的颜色和已经有的颜色按照一定的方式进行混合。例如:想使物体拥有半透明的效果,或者绘制叠加光亮的效果,这时候就需要用到opengles混合

如上图所示,为石头墙、绿色矩形、蓝色云彩 三个矩形混合后的展示效果。三个矩形(z轴深度由深到浅)分别为,石头墙、绿色矩形、蓝色云彩。

一、混合api

在opengles中若使用混合,需要用到api函数方法(java):
void glblendfunc( int srcfactor, int destfactor );

(1) 其opengl函数原型为:
void glblendfunc(glenum srcfactor, glenum destfactor);

(2) 其功能为:
控制新画上来的颜色 (source values, rgba) 和 已经在帧缓冲区中的颜色 (destination values, rgba) 的混合时源与目标 在最终颜色通道中所占的比例

(3) 方法参数

  • srcfactor:代表源因子,即新画上来的颜色。

该参数由九个枚举型被接受使用:
gl_zero,
gl_one,
gl_dst_color,
gl_one_minus_dst_color,
gl_src_alpha,
gl_one_minus_src_alpha,
gl_dst_alpha,
gl_one_minus_dst_alpha,
gl_src_alpha_saturate.

  • destfactor:代表的是目标因子,即已经在帧缓冲区中的颜色。

该参数由八个枚举型被接受使用:
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

二、参数含义

  • 举个栗子
  • 参数含义

2.1 举个栗子

我们先看一个常用混合参数搭配:

// 最常用的混合因子搭配方式
// 即源因子为 gl_src_alpha 目标因子为 gl_one_minus_src_alpha 
glblendfunc(gl30.gl_src_alpha, gl30.gl_one_minus_src_alpha);

以上参数搭配方式假设:

  • (sr, sg, sb, sa)代表源颜色src(要绘制的颜色)
  • (dr, dg, db, da)代表目标颜色dest(缓冲区中颜色)

如果源因子的不透明度为0.2(透明度0.8),alpha值的最大值为1,那么源与目标混合后的最终颜色值为:

// 最终颜色值为:0.2*s+0.8*d
// opengl es 最终颜色计算结果如下:
(0.2*sr+(1-0.2)*dr , 0.2*sg+(1-0.2)*dg , 0.2*sb+(1-0.2)*db,0.2*sa+(1-0.2)*da)

启用混合与纹理矩形绘制顺序代码举例:

// 开启混合  
gl.glenable(gl10.gl_blend);  
// 指定混合比例
gl.glblendfunc(gl10.gl_src_alpha, gl10.gl_one_minus_src_alpha);  
  
// 绘制石头墙纹理矩形
gl.glpushmatrix();  
gl.gltranslatef(-0.8f, -0.8f, -0.02f);  
wallrect.drawself(gl, tex_wall);  
gl.glpopmatrix();  
  
// 绘制绿色纹理矩形
gl.glpushmatrix();  
gl.gltranslatef(0, 0, -0.01f);  
greenrect.drawself(gl, tex_green);  
gl.glpopmatrix();  
  
// 绘制蓝色云彩纹理矩形
gl.glpushmatrix();  
gl.gltranslatef(0.8f, 0.8f, 0f);  
cloudrect.drawself(gl, tex_cloud);  
gl.glpopmatrix();`

2.2 参数含义

有了上边的例子,我们再回来看各个参数因子。

假设:

  • (sr, sg, sb, sa)代表源颜色src(要绘制的颜色)
  • (dr, dg, db, da)代表目标颜色dest(缓冲区中颜色)
  • (kr, kg, kb, ka)代表缓冲区中各个通道r, g, b, a的最大值。

那么各个参数因子所代表的值如下表所示:

混合因子 各颜色通道色彩比例值
gl_zero (0,0,0,0)
gl_one (1,1,1,1)
gl_src_color (sr/kr, sg/kg, sb/kb, sa/ka)
gl_dst_color (dr/kr, dg/kg, db/kb, da/ka)
gl_one_minus_src_color (1,1,1,1) – (sr/kr,sg/kg,sb/kb,sa/ka)
gl_one_minus_dst_color (1,1,1,1) – (dr/kr,dg/kg,db/kb,da/ka)
gl_src_alpha ( sa/ka, sa/ka, sa/ka, sa/ka )
gl_one_minus_src_alpha (1,1,1,1) – (sa/ka,sa/ka,sa/ka,sa/ka)
gl_dst_alpha ( da/ka, da/ka, da/ka, da/ka )
gl_one_minus_dst_alpha (1,1,1,1) – (da/ka,da/ka,da/ka,da/ka)
gl_src_alpha_saturate (min(sa, ka, da)/ka,min(sa, ka, da)/ka,min(sa, ka, da)/ka,1)

三、 几种常用混合方式效果

下边以三张纹理图片在不同混合因子设置下的效果图,对几种常见的混合效果进行举例说明。

  • 其中 离摄像机最远的为一张 alpha=1.0石头墙纹理图;
  • 其次 为一张 alpha=0.6蓝色云彩纹理图;
  • 最后离摄像机最近的为一张 alpha=0.4的绿色纹理图。

3.1 混合(gl_one, gl_zero)

源颜色(最后绘制的绿色矩形)参数因子为gl_one,目标色(缓冲区中颜色)参数因子为gl_zero。

这种参数因子组合混合比例 (1.0, 0.0)

  • 源颜色(最后绘制的绿色矩形)覆盖目标色(缓冲区中颜色);
  • 目标色(缓冲区中颜色)不起作用,

其运行效果如下图所示:

3.2 混合(gl_one, gl_one)

源颜色(最后绘制的绿色矩形)与 目标色(缓冲区中颜色)均为gl_one。

这种参数因子组合混合比例 (1.0, 1.0)

  • 源颜色(最后绘制的绿色矩形)目标色(缓冲区中颜色)在混合时,源与目标的色彩通道颜色所占的比例相同

其运行效果如下图所示:

仔细观察以上效果图,可以看到三张图片叠加部分,几乎为白色。

3.3 混合(gl_one, gl_one_minus_dst_alpha)

源颜色(最后绘制的绿色矩形)参数因子为 gl_one,目标色(缓冲区中颜色)参数因子为 gl_one_minus_dst_alpha。

这种参数因子组合混合比例 (1.0, 1.0-da/ka)

  • 源颜色(最后绘制的绿色矩形)目标色(缓冲区中颜色),在混合时取源颜色 (1- da/ka)比例进行混合。

其运行效果如下图所示:

观察以上效果图:可以看到最上边绿色矩形占最终混合颜色的比例较高。
三张纹理绘制时:

  • 前两张纹理混合时:源颜色为蓝色云彩纹理矩形,目标颜色为石头墙纹理矩形
  • 由于混合比例为 (1.0, 1.0-da/ka),混合后的最终颜色只显示蓝色云彩纹理矩形(石头墙纹理的alpha=1.0,最终石头墙颜色所占的比例 1.0-1.0=0.0,比例为0)。
  • 其次绿色纹理矩形缓冲区中颜色进行混合:源颜色为绿色纹理矩形,目标颜色为缓冲区中颜色

混合后的最终颜色基本只显示绿色纹理矩形(蓝色云彩纹理矩形的alpha=0.6,(1-0.6)云纹理与绿色矩形混合后,几乎看不到云纹理的颜色)。

3.4 混合 (gl_src_alpha, gl_one)

源颜色(最后绘制的绿色矩形)参数因子为 gl_src_alpha,目标色(缓冲区中颜色)参数因子为 gl_one。

这种参数因子组合混合比例 (sa/ka, 1.0)

  • 源颜色(最后绘制的绿色矩形)目标色(缓冲区中颜色),在混合时以源颜色值乘以sa/ka与目标颜色值相加。

其运行效果如下图所示:

观察以上效果图,可以看出目标墙面与云纹理混合后墙面纹理颜色值所占比例较高,三个纹理图片叠加部分有些像素点为白色。

3.5 混合 (gl_src_alpha, gl_one_minus_src_alpha)

这种方式是最常用的混合方式,源颜色(最后绘制的绿色矩形)参数因子为 gl_src_alpha,目标色(缓冲区中颜色)参数因子为 gl_one_minus_src_alpha。

这种参数因子组合混合比例 (sa/ka, 1.0-sa/ka)

  • 源颜色(最后绘制的绿色矩形)目标色(缓冲区中颜色)在混合时,取源颜色的 (sa/ka) 与目标颜色 (1.0-sa/ka) 相加计算最终的颜色值。

其运行效果如下图所示:

附案例代码

案例源码下载地址:
https://download.csdn.net/download/aiwusheng/64038379

到此这篇关于一文详解 opengl es 纹理颜色混合的文章就介绍到这了,更多相关opengl es 纹理颜色混合内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!