在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

= THE END =

一文详解 OpenGL ES 纹理颜色混合的更多相关文章

  1. 一文详解 OpenGL ES 3.x 渲染管线

    OpenGL ES 构建的三维空间,其中的三维实体由许多的三角形拼接构成.如下图左侧所示的三维实体圆锥,其由许多三角形按照一定规律拼接构成.而组成圆锥的每一个三角形,其任意一个顶点由三维空间中 x.y ...

  2. 详解 OpenGL ES 2.x 渲染流程

    khronos官方对OpenGL ES的描述如下: OpenGL ES is a royalty-free, cross-platform API for rendering advanced 2D ...

  3. 一文详解Hexo+Github小白建站

    作者:玩世不恭的Coder时间:2020-03-08说明:本文为原创文章,未经允许不可转载,转载前请联系作者 一文详解Hexo+Github小白建站 前言 GitHub是一个面向开源及私有软件项目的托 ...

  4. 一文详解 Linux 系统常用监控工一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop)具(top,htop,iotop,iftop)

    一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop)     概 述 本文主要记录一下 Linux 系统上一些常用的系统监控工具,非常好用.正所谓磨刀不误砍柴工,花点时间 ...

  5. 一文详解 纹理采样与Mipmap纹理——构建山地渲染效果

    在开发一些相对较大的场景时,例如:一片铺满相同草地纹理的丘陵地形,如果不采用一些技术手段,就会出现远处的丘陵较近处的丘陵相比更加的清晰的视觉效果,而这种效果与真实世界中近处的物体清晰远处物体模糊的效果 ...

  6. Android OpenGL ES 开发(九): OpenGL ES 纹理贴图

    一.概念 一般说来,纹理是表示物体表面的一幅或几幅二维图形,也称纹理贴图(texture).当把纹理按照特定的方式映射到物体表面上的时候,能使物体看上去更加真实.当前流行的图形系统中,纹理绘制已经成为 ...

  7. OpenGL ES: 纹理采样 texture sample

    Sampler (GLSL) Sampler通常是在Fragment shader(片元着色器)内定义的,这是一个uniform类型的变量,即处理不同的片元时这个变量是一致不变的.一个sampler和 ...

  8. 一文详解 WebSocket 网络协议

    WebSocket 协议运行在TCP协议之上,与Http协议同属于应用层网络数据传输协议.WebSocket相比于Http协议最大的特点是:允许服务端主动向客户端推送数据(从而解决Http 1.1协议 ...

  9. 1.3w字,一文详解死锁!

    死锁(Dead Lock)指的是两个或两个以上的运算单元(进程.线程或协程),都在等待对方停止执行,以取得系统资源,但是没有一方提前退出,就称为死锁. 1.死锁演示 死锁的形成分为两个方面,一个是使用 ...

随机推荐

  1. 微信小程序(九)

    小程序运行环境与基本架构 每个小程序都是运行在它所在的微信客户端上的,通过微信客户端给它提供的运行环境,小程序可以直接获取微信客户端的原生体验和原生能力. wxml视图文件和wxss样式文件都是对渲染 ...

  2. 保姆级别的vue + ElementUI 搭建后台管理系统教程

    vue + ElementUI 搭建后台管理系统记录 本文档记录了该系统从零配置的完整过程 项目源码请访问:https://gitee.com/szxio/vue2Admin,如果感觉对你有帮助,请点 ...

  3. CSharp使用Thrift作为RPC框架入门(一)

    前言 本文将介绍由 Facebook 开发的远程服务调用框架 Apache Thrift,它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++ ...

  4. 【Tool】IDEA功能--SVN和Git

    IDEA功能--SVN和Git 2019-11-08  21:12:22  by冲冲 1.IDEA的SVN (1)提交项目代码到SVN服务器 ① 指定不用上传的目录 ② 设置项目上传的路径 SVN服务 ...

  5. GraalVM最佳实践,使用Java开发CLI、Desktop(JavaFX)、Web(SpringBoot)项目,并使用native-image技术把Java代码静态编译为独立可执行文件(本机映像)

    原创文章,转载请注明出处! 源码地址: Gitee Gtihub 介绍 GraalVM最佳实践,使用Java开发CLI.Desktop(JavaFX).Web(SpringBoot)项目,并使用nat ...

  6. HDU 7066 - NJU emulator(构造题)

    题面传送门 提供一种不同于官方题解.需要的操作次数比官方题解多(官方题解大概是 \(2\times 16\),我这大概是 \(3\times 16\)),但能通过此题的做法. 首先我们考虑一个暴力,我 ...

  7. P6973 [NEERC2016]List of Primes

    题目传送门. 题意简述:将质数集合的所有子集按照子集和为第一关键字,字典序为第二关键字从小到大排序,求最终形成的字符串的第 \(l\sim r\) 个字符. 在 cnblogs 内查看. 又是一道妙妙 ...

  8. 【机器学习与R语言】3-概率学习朴素贝叶斯(NB)

    目录 1.理解朴素贝叶斯 1)基本概念 2)朴素贝叶斯算法 2.朴素贝斯分类应用 1)收集数据 2)探索和准备数据 3)训练模型 4)评估模型性能 5)提升模型性能 1.理解朴素贝叶斯 1)基本概念 ...

  9. 睡眠或者重启windows,无法ssh连接或者pingVMware的虚机

    睡眠后无法直接ssh重连VMware主机问题 这个问题我在win8上出现过,win10看了下同事可以正常连,不知道其他有没有问题. 解决方法: 1.关闭vmnet8和vmnet0里面的 npcap 功 ...

  10. python函数初体验

    函数 函数参数w 形式参数>>>>(被指定具体的值)默认参数, 实际参数是调用时候的实际指定参数 我们把函数⾥⾯的参数叫形式函数,函数实际调⽤的时候,赋予的参数叫实际函数 定义 ...