当前位置: 首页 > news >正文

OpenGL ES学习(7)——混合

本文介绍使用是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

相关文章:

  • Spoon Kettle 连接之记录集连接详解(Merge join)
  • 光传送网管控融合研究与智能化演进思考
  • 应对三大行业痛点,利尔达用芯打造智能换电系统平台
  • RedHat Linux修改SSHD默认22端口
  • Docker: hello world
  • 08.文件操作
  • linux上redis单机的安装
  • 云服务器CentOS8 安装 Oracle19c
  • 沃尔玛、eBay、wish、新蛋等美系平台对于测评风控点有哪些?怎么解决
  • 霸道 阿里最新版Spring Cloud Alibaba项目文档,竟将重要组件弃用
  • lightdb22.3-oracle系统视图兼容增强
  • 【大数据】Hadoop三大核心组件入门
  • Jackson别名@JsonAlias详细用法
  • 机器学习(二十八):灰狼优化算法对神经网络的优化
  • RabbitMQ入门(二)
  • 【Linux系统编程】快速查找errno错误码信息
  • 4个实用的微服务测试策略
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Angular2开发踩坑系列-生产环境编译
  • Babel配置的不完全指南
  • es6要点
  • in typeof instanceof ===这些运算符有什么作用
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • 大快搜索数据爬虫技术实例安装教学篇
  • 分布式事物理论与实践
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 机器学习中为什么要做归一化normalization
  • 经典排序算法及其 Java 实现
  • 码农张的Bug人生 - 见面之礼
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 微服务框架lagom
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 详解移动APP与web APP的区别
  • 学习笔记TF060:图像语音结合,看图说话
  • 智能合约Solidity教程-事件和日志(一)
  • postgresql行列转换函数
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (力扣)1314.矩阵区域和
  • (七)Knockout 创建自定义绑定
  • (四)c52学习之旅-流水LED灯
  • (原創) 未来三学期想要修的课 (日記)
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)Scala的“=”符号简介
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .net 流——流的类型体系简单介绍
  • .NetCore项目nginx发布
  • .net打印*三角形