Cocos2d中使用颜色混合:加算,减算
转自http://blog.sina.com.cn/s/blog_7a2ffd5c0100xtid.html
CCSprite有一个ccBlendFunc类型的blendFunc_结构体成员,可以用来设置描绘时的颜色混合方案。ccBlendFunc包含了一个src和一个dst,分别表示目标和源的运算因子。
如果我们对一个Sprite使用setBlendFunc方法,如:
[Sprite setBlendFunc:(ccBlendFunc){GL_ONE,GL_ZERO} ];
会以这个Sprite作为源,Sprite所在位置的其它像素作为目标,进行混合运算:
源的RGBA变量:Rs,Gs,Bs,As;
目标的RGBA: Rd,Gd,Bd,Ad;
源的各个运算因子: N_Rs,N_Gs,N_Bs,N_As;
目标的各个运算因子: N_Rd,N_Gd,N_Bd,N_Ad;
混合后的RGBA为:(Rs*N_Rs+ Rd* N_Rd,Gs*N_Gs+ Gd* N_Gd,
Bs*N_Bs+ Bd* N_Bd,As*N_As+ Ad* N_Ad)
其中的运算因子包括:
GL_ONE:1.0
GL_ZERO:0.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值作为因子
我们可以在CCSprite的init方法中看到,默认的状态下使用GL_ONE,GL_ONE_MINUS_SRC_ALPHA这两个参数,这也是我们看到的情况,Sprite会覆盖下面的描绘,但如果有透明的地方,则会显示下面的色值。让我们看一下说使用各个参数的效果:
0:不改变混合,使用默认的情况:
1:如果设置glBlendFunc(GL_ONE,GL_ZERO), 表面完全使用源颜色,即和不混合一样的效果,但是如果Sprite本身有透明的地方,则透明的地方会变成黑色。因为此时不显示目标的颜色。即使透明度为0也没有意义。
2:如果设置glBlendFunc(GL_ZERO, GL_ONE),表示不使用源颜色,那么该Sprite便不被画出来。
3:使用ALPHA相关的因子,会根据透明度来计算,比如透明度高的颜色占较大比重等。如默认情况。
附:
| 常数 | 相关因子 | 融合因子结果 |
| GL_ZERO | 源因子或目的因子 | (0,0,0,0) |
| GL_ONE | 源因子或目的因子 | (1,1,1,1) |
| GL_DST_COLOR | 源因子 | (Rd,Gd,Bd,Ad) |
| GL_SRC_COLOR | 目的因子 | (Rs,Gs,Bs,As) |
| GL_ONE_MINUS_DST_COLOR | 源因子 | (1,1,1,1)-(Rd,Gd,Bd,Ad) |
| GL_ONE_MINUS_SRC_COLOR | 目的因子 | (1,1,1,1)-(Rs,Gs,Bs,As) |
| GL_SRC_ALPHA | 源因子或目的因子 | (As,As,As,As) |
| GL_ONE_MINUS_SRC_ALPHA | 源因子或目的因子 | (1,1,1,1)-(As,As,As,As) |
| GL_DST_ALPHA | 源因子或目的因子 | (Ad,Ad,Ad,Ad) |
| GL_ONE_MINUS_DST_ALPHA | 源因子或目的因子 | (1,1,1,1)-(Ad,Ad,Ad,Ad) |
| GL_SRC_ALPHA_SATURATE | 源因子 | (f,f,f,1); f=min(As,1-Ad) |
Cocos2d中使用颜色混合:加算,减算的更多相关文章
- 关于javascript中对浮点加,减,乘,除的精度分析
大学专业是计算机童鞋或多或小的知道 计算机是由二进制存储和处理数字的,不能精确到处理浮点数,且javascript也没有这样的方法 所以在浏览器计算的时候也会有误差,比如说 我想用 3.3 / 1.1 ...
- Linux中日期的加减运算
Linux中日期的加减运算 目录 在显示方面 在设定时间方面 时间的加减 正文 date命令本身提供了日期的加减运算. date 可以用来显示或设定系统的日期与时间. 回到顶部 在显示方面 使用者可以 ...
- oracle 中日期的加减
oracle 中日期的加减 加法 select sysdate,add_months(sysdate,12) from dual; --加1年 select sysdate,add_ ...
- C语言中的指针加减偏移量
C语言指针偏移技巧(也是一个要注意的坑) - 陈杰柱的博客 - CSDN博客 https://blog.csdn.net/cjzjolly/article/details/82116772 C语言中 ...
- Java初学者作业——定义一个计算器类, 实现计算器类中加、 减、 乘、 除的运算方法, 每个方法能够接收2个参数。
返回本章节 返回作业目录 需求说明: 定义一个计算器类, 实现计算器类中加. 减. 乘. 除的运算方法, 每个方法能够接收2个参数. 实现思路: 定义计算器类. 定义计算器类中加.减.乘.除的方法. ...
- cocos2d中如何使用图片纹理图集的加载来实现一个动画的功能
cocos2d中要实现一个动画,一般采用纹理图集的方式,也就是说把几个连续动作的图片挨个显示切换这样就是动画 一: 首先先看下今天要实现的具体的目的,打飞机的时间屏幕上会有一个喷火的小飞机,飞机的尾部 ...
- Cocos2D中图片加-hd后缀的说明
你可能注意到实际上游戏中的sprite都有2张图片,它都对应该精灵,并包含在资源包中(resource pack): player.png(27x40 pixels)和player-hd.png(do ...
- c语言自加自减三道题
int x , y,z; x = 0; y = z = -1; x += -z ---y; printf("x=%d\n",x) x = 2 为什么? x + = -z - - ...
- C# DateTime 日期加1天 减一天 加一月 减一月 等方法
//今天 DateTime.Now.Date.ToShortDateString(); //昨天,就是今天的日期减一 DateTime.Now.AddDays(-).ToShortDateString ...
随机推荐
- 第七次课:ssh的集成(SpringMV+Spring+Hibernate)
第一部分:程序结构 第二部分:配置 1.配置web.xml文件,启动spring和springMVC: 1)配置启动spring: <context-param> <param-na ...
- noip2015-day1-t2
题意:有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学.游戏开始时,每人都只知道自己的生日.之后每一轮中, ...
- shell语法快速入门(1)
#得到绝对路径 DIR=$(cd `dirname $0`;pwd) $DIR/file.txt #去掉#注释 egrep -v "(#|^$)" /etc/zabbix/zabb ...
- SECHS
题目描述 对于给定的正整数N,我们把[1, N]中的整数按照字符串的字典序排序得到N 项数列A(N). 例如,N = 11的时候,A(N) = {1, 10, 11, 2, 3, 4, 5, 6, 7 ...
- Ajax跨域请求ashx文件与Webservice文件
前台页面: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1 ...
- git 使用笔记
git操作: git checkout 分支名称 // 切换分支git branch -a // 查看分支信息和当前分支 git pull // 将服务器所有代码下载到本地git merge orig ...
- 省市区县镇级联数据JS版
前言:网站开发经常会涉及到报名,报名通常就会有地区级联的要求.如下所示.做这个功能就必须要有数据支撑.昨天努力了一天,从网上鼓捣了一份数据.分享下.纯技术性分享,非盈利的.如果有侵权的地方请知会,马上 ...
- jenkins插件 build timeout和build timestamp
build timeout plugin, 允许对job设置timeout时间,当超时时,job将abort. build timestamp pluin,使得job log的每次输出前面都增加当时的 ...
- mysql导入sql文件
从命令提示符下到MYSQL文件目录中的Bin文件夹下,执行命令 mysql -u root -p databasename < db.sql 其中root是你MYSQL的用户名,database ...
- Linux kernel develop -- Hello World
hello.c: #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h&g ...