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

【2014-04-04】【转】OpenGL ES 混合的理解

[历史归档]本文原发布于 cstriker1407.info 个人博客,内容为历史存档,仅供参考。
发布时间:2014-04-04| 标题:【转】OpenGL ES 混合的理解分类:编程 / C && C++ / cocos2dx |标签:opengl·cocos2dx


【转】OpenGL ES 混合的理解

    • 混合的介绍
    • 源因子和目标因子
    • 常用参数
    • 例子
    • 在线测试

本文转自【 http://blog.csdn.net/zhooker1/article/details/8600740 】,有删改。

混合的介绍

混合是什么呢?混合就是把两种颜色混在一起。具体一点,就是把某一像素位置原来的颜色和将要画上去的颜色,通过某种方式混在一起,从而实现特殊的效果。
假设我们需要绘制这样一个场景:透过红色的玻璃去看绿色的物体,那么可以先绘制绿色的物体,再绘制红色玻璃。在绘制红色玻璃的时候,利用“混合”功能,把将要绘制上去的红色和原来的绿色进行混合,于是得到一种新的颜色,看上去就好像玻璃是半透明的。
使用OpenGL的混合功能,只需要调用:glEnable(GL_BLEND);即可。
关闭
OpenGL的混合功能,只需要调用:**glDisable(GL_BLEND);**即可。

注意:只有在RGBA模式下,才可以使用混合功能,颜色索引模式下是无法使用混合功能的。

源因子和目标因子

前面我们已经提到,混合需要把原来的颜色和将要画上去的颜色找出来,经过某种方式处理后得到一种新的颜色。这里把将要画上去的颜色称为“源颜色”,把原来的颜色称为“目标颜色”。

**将要画上去的颜色 ==>>**源颜色

原来的颜色**==>>**目标颜色

OpenGL会把源颜色和目标颜色各自取出,并乘以一个系数(源颜色乘以的系数称为“源因子”,目标颜色乘以的系数称为“目标因子”),然后相加,这样就得到了新的颜色。(也可以不是相加,新版本的OpenGL可以设置运算方式,包括加、减、取两者中较大的、取两者中较小的、逻辑运算等,但我们这里为了简单起见,不讨论这个了)
下面用数学公式来表达一下这个运算方式。假设源颜色的四个分量(指红色,绿色,蓝色,alpha值)是(Rs, Gs, Bs, As),目标颜色的四个分量是(Rd, Gd, Bd, Ad),又设源因子为(Sr, Sg, Sb, Sa),目标因子为(Dr, Dg, Db, Da)。则混合产生的新颜色可以表示为:

(Rs*Sr+Rd*Dr, Gs*Sg+Gd*Dg, Bs*Sb+Bd*Db, As*Sa+Ad*Da)

当然了,如果颜色的某一分量超过了1.0,则它会被自动截取为1.0,不需要考虑越界的问题。

源因子和目标因子是可以通过glBlendFunc函数来进行设置的。glBlendFunc有两个参数,前者表示源因子,后者表示目标因子。这两个参数可以是多种值,下面介绍比较常用的几种。

常用参数

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值来作为因子。
除此以外,还有GL_SRC_COLOR(把源颜色的四个分量分别作为因子的四个分量)、GL_ONE_MINUS_SRC_COLOR、GL_DST_COLOR、GL_ONE_MINUS_DST_COLOR等,前两个在OpenGL旧版本中只能用于设置目标因子,后两个在OpenGL旧版本中只能用于设置源因子。新版本的OpenGL则没有这个限制,并且支持新的GL_CONST_COLOR(设定一种常数颜色,将其四个分量分别作为因子的四个分量)、GL_ONE_MINUS_CONST_COLOR、GL_CONST_ALPHA、GL_ONE_MINUS_CONST_ALPHA。另外还有GL_SRC_ALPHA_SATURATE。新版本的OpenGL还允许颜色的alpha值和RGB值采用不同的混合因子。但这些都不是我们现在所需要了解的。毕竟这还是入门教材,不需要整得太复杂~

例子

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

在线测试

【 http://www.andersriggelsen.dk/glblendfunc.php 】

http://www.jsqmd.com/news/1380209/

相关文章:

  • HS2汉化补丁完整指南:15分钟快速实现游戏中文界面
  • 新手也能上手 AI论文网站推荐:2026最新测评与对比
  • Vibe Coding:重塑前端开发体验的现代范式与实践指南
  • 低脂鱼丸哪家品质好:【深鲜季】配方清爽 - 17728098551
  • 大型品牌如何审核TikTok代运营报价?账号矩阵、本地化与KOC费用完整拆解及采购重点
  • 深入理解计算机系统原理与性能优化实战
  • 【2014-05-19】某《魔鬼训练营》读书笔记:msfpayload的使用及免杀工具
  • Linux PipeWire深度解析之pw_properties_new_dict调用流程与实战(五十七)
  • 神州数码交换机配置实战:从VLAN划分到安全策略全解析
  • Linux 终端命令速查表 -- 07 文件与文件夹速查表
  • LangGraph核心三要素与智能体构建实战:从状态管理到复杂工作流编排
  • 《专利法》规定,专利申请必须提交至国家知识产权局(CNIPA),由其依法进行形式审查和实质审查
  • BilibiliDown终极指南:如何轻松下载B站视频与高质量音频
  • 实点科技5系列一体式I/O EI5R模块介绍
  • 上证3966点,三拨人的三种活法
  • 无人机IC认证怎么选:沃德检测一站式路径解析 - 生活动态圈
  • 【面试】【数字IC基础】跨时钟域处理一(CDC,Clock Domain Crossing)(一)
  • GetQzonehistory:5分钟快速备份你的QQ空间完整历史记录
  • 【2014-04-27】使用SQLMAP注入DVWA
  • 视频字幕翻译成中文怎么做?10个常用工具的功能、价格与适用人群
  • 电动车托运要拆电池吗?2026跨省寄电瓶车避坑全攻略,5家物流实测对比 - 快递物流资讯
  • 微信小程序云函数调用第三方API:绕过域名限制与安全实践指南
  • Linux PipeWire深度解析之pw_properties_copy调用流程与实战(五十八)
  • NS-Scope上位机软件:解锁泰克TDS1000/2000示波器数据采集与自动化潜能
  • C++项目工程化实战:gflags配置管理与gtest单元测试框架详解
  • 英文essay交之前用哪种检测自查AI率
  • LeetCode双指针技巧:原地删除有序数组重复项
  • linux系统中项目工程中的多文件管理(makfile)
  • Wi-Fi信道与频宽详解:从5GHz到6GHz,优化网络速度与稳定性的核心指南
  • oracle系统表