本文介绍使用是OpenGL ES 混合相关技术,它可以实现如现实世界中那样的半透明物体效果。

1.1 混合基本认识

混合技术就是将两个片元调和,将通过各项测试准备进入帧缓冲的片元(源片元)和原有片元(目标片元)按照设定的比例加权计算出最终片元的颜色值,不再是新片元直接覆盖缓冲中的目标片元。

如何计算两个片元的加权比例?OpenGL ES 2.0中设置混合因子来确定两片元的加权比例。

  • 源因子:用于确定将进入帧缓冲的片元在最终片元的比例;
  • 目标因子:用于确定原帧缓冲中的片元在最终片元中的比例;

OpenGL ES中一个颜色值包括4个色彩通道(r,g,b,a),上述两种因子都各有4个分量值。

混合计算公式

  • 假设源因子[Sr,Sg,Sb,Sa];目标因子[Dr,Dg,Db,Da];r,g,b,a下标分别表示红、绿、蓝、透明度。
  • 假设源片元颜色值[Rs,Gs,Bs,As];目标片元颜色值[Rd,Gd,Bd,Ad]
    混合后最终片元各个颜色通道值 = [ R s S r + R d D r , G s S g + G d D g , B s S b + B d D b , A s S a + A d D a ] 混合后最终片元各个颜色通道值 = [R~s~S~r~+R~d~D~r~,G~s~S~g~+G~d~D~g~,B~s~S~b~+B~d~D~b~,A~s~S~a~+A~d~D~a~] 混合后最终片元各个颜色通道值=[R s S r +R d D r ,G s S g +G d D g ,B s S b +B d D b ,A s S a +A d D a ]

1.2 源因子和目标因子

OpenGL ES为了简化处理不允许开发人员任意设置混合因子,而是系统预置了。常用的混合因子值如下表所示:

常量名 RGB混合因子 A混合因子
GL_ZERO [0,0,0] 0
GL_ONE [1,1,1] 1
GL_SRC_COLOR [Rs,Gs,Bs] As
GL_ONE_MINUS_SRC_COLOR [1-Rs,1-Gs,1-Bs] 1-As
GL_DST_COLOR [Rd,Gd,Bd] Ad
GL_ONE_MINUS_DST_COLOR [1-Rd,1-Gd,1-Bd] 1-Ad
GL_SRC_ALPHA [As,As,As] As
GL_ONE_MINUS_SRC_ALPHA [1-As,1-As,1-As] 1-As
GL_DST_ALPHA [Ad,Ad,Ad] Ad
GL_ONE_MINUS_DST_ALPHA [1-Ad,1-Ad,1-Ad] 1-Ad
GL_SRC_ALPHA_SATURATE
(只可以作源因子)
[f,f,f]
其中f=min(As,1-Ad)
1

常量名称中包含“SRC”的代表各通道来自源片元,有DST的代表各通道值来自目标片元。

两种常用的组合

  • 源因子GL_SRC_ALPHA + 目标因子GL_ONE_MINUS_SRC_ALPHA ,可实现半透明遮挡效果
  • 源因子GL_SRC_COLOR + 目标因子GL_ONE_MINUS_SRC_COLOR ,可实现滤光镜效果

1.3 混合代码API

//开启混合
GLES20.glEnable(GLES20.GL_BLEND);
//设置混合因子,滤光镜效果
GLES20.glBlendFunc(GLES20.GL_SRC_COLOR, GLES20.GL_ONE_MINUS_SRC_COLOR);
//设置混合因子,半透明遮挡效果
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA,GLES20.GL_ONE_MINUS_CONSTANT_ALPHA);//...
//关闭混合
GLES20.glDisable(GLES20.GL_BLEND);

1.4 混合demo

1.4.1 demo效果

1.4.2 完整demo

https://download.csdn.net/download/ITMonkeyKing/86504570

【参考】

  1. https://www.khronos.org/opengles/
  2. 《OpenGL ES应用开发实践指南 Android卷 Kevin Brothaler》
  3. https://en.wikipedia.org/wiki/OpenGL_ES
  4. https://developer.android.google.cn/guide/topics/graphics/opengl
  5. https://developer.android.google.cn/training/graphics/opengl
  6. Android3D游戏开发技术宝典OpenGL ES 2.0

OpenGL ES学习(7)——混合相关推荐

  1. IOS OpenGL ES GPUImage 滤色混合 GPUImageScreenBlendFilter

    目录 一.简介 二.效果演示 三.源码下载 四.猜你喜欢 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础 零基础 Ope ...

  2. Android OpenGL ES 学习(二) -- 图形渲染管线和GLSL

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  3. Android OpenGl Es 学习(二):定义顶点和着色器

    概述 这是一个新的系列,学习OpengGl Es,其实是<OpenGl Es 应用开发实践指南 Android卷>的学习笔记,感兴趣的可以直接看这本书,当然这个会记录自己的理解,以下只作为 ...

  4. IOS OpenGL ES GPUImage 遮罩混合 GPUImageMaskFilter

    目录 一.简介 二.效果演示 三.源码下载 四.猜你喜欢 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础 零基础 Ope ...

  5. IOS OpenGL ES GPUImage 柔光混合 GPUImageSoftLightBlendFilter

    目录 一.简介 二.效果演示 三.源码下载 四.猜你喜欢 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础 零基础 Ope ...

  6. IOS OpenGL ES GPUImage 排除混合 GPUImageExclusionBlendFilter

    目录 一.简介 二.效果演示 三.源码下载 四.猜你喜欢 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础 零基础 Ope ...

  7. IOS OpenGL ES GPUImage 图像混合 GPUImageNormalBlendFilter

    目录 一.简介 二.效果演示 三.源码下载 四.猜你喜欢 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础 零基础 Ope ...

  8. 【eoe特刊】第二十七期 OpenGL ES学习及项目解析

    经过一个月征稿.编辑,新的一版特刊终于出炉了. 本次特刊的制作,改变以往的制作方式,完全取自网友的独自的风格. 在只有一个主题的前提下,完全是通过社区的热心的网友,根据自己的想法,自行设计,自由发挥, ...

  9. Android OpenGL ES 学习(十一) –渲染YUV视频以及视频抖音特效

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  10. Android OpenGL ES 学习(六) – 使用 VBO、VAO 和 EBO/IBO 优化程序

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

最新文章

  1. PyQt5教程——组件 Ⅱ(八)
  2. 效率 qt_Qt开发之Go篇(三)
  3. 让产品有效迭代,前端A/B Testing的简单实现
  4. include_fns.php_一步一步教你用PHP+MySql筹建网站 No.3 管理页面_mysql
  5. 安装DNN时可能出现的错误
  6. Codeforces Round #660 (Div. 2)
  7. 两教授吐槽:如今博士研究生的论文写作水平为何如此堪忧?
  8. 【scala】IDEA运行scala程序:Error:scalac: bad option: ‘-make:transitive‘
  9. python编程(类变量和实例变量)
  10. Codevs 1215 迷宫
  11. [swift 进阶]读书笔记-第八章:错误处理 C8P3 带有类型的错误
  12. Python实战项目7个有趣的小游戏
  13. java qq 邮箱发送错误以及端口号
  14. TrueCrypt安装及其使用教程
  15. Unsupervised Domain Adaptation by Backpropagation
  16. 78岁老人爱上玩乐器硬是学会了吹奏萨克斯
  17. 前端RSA加密,加密字符串过长,提示“Message too long for RSA”问题
  18. 狮虎论:软件测试和软件开发到底哪个实际工资更高
  19. 梦想照进现实|CSDN 实体奖牌 第二期
  20. C语言教程(七):函数

热门文章

  1. win10下Remix-IDE桌面版一直在空白页面不变,File -> Open Folder,一直没反应
  2. 如何添加Iconfont图标到项目及创建新项目?
  3. [AcWing] 9. 分组背包问题(C++实现)分组背包问题模板题
  4. EXCEL保存时出现“由于共享冲突,您的更改不能保存到x‘x‘x‘x.xlsx0”解决方法
  5. 虚拟串口软件和串口调试助手的简单使用
  6. 打破校史!国家杰青发表顶级论文
  7. Anaconda中使用Jupyter Notebook
  8. Java实习生入职第一天
  9. strtotime()函数PHP时间格式转化
  10. Java基础入门(持续更新)