位置: 编程技术 - 正文

在cocos2dx 中添加自定义 shaders --- 改变 HSL 色调,饱和度, 亮度(cocos怎么用)

编辑:rootadmin

推荐整理分享在cocos2dx 中添加自定义 shaders --- 改变 HSL 色调,饱和度, 亮度(cocos怎么用),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:cocos2dx怎么用,cocos2dx创建项目,cocos2d教程,cocos2dx创建项目,cocos怎么用,cocos2d怎么创建项目,cocos2dx怎么用,cocos2dx怎么用,内容如对您有帮助,希望把文章链接给更多的朋友!

订阅

步骤1

准备 shaders文件- ccShad_Hsl.h

将它放入E:HSluZiLongcocos2d-x-2.2.1cocos2d-x-2.2.1cocos2dxshaders 目录下

步骤2.

在 ccShaders.h 中加入代码

extern CC_DLL const GLchar * ccPositionColorHSL_frag;extern CC_DLL const GLchar * ccPositionColorHSL_vert;

在 ccShaders.cpp 中加入代码

const GLchar * ccPositionColorHSL_frag =#include "ccShad_Hsl.h"

在 CCGLProgram.h 中定义

#define KCCShader_Position_hsl"KCCShader_Position_hsl"

在 CCShaderCache.cpp 中 追加枚举 kCCShaderType_Position_hsl,

在 CCShaderCache.cpp 的 reloadDefaultShaders中加入代码

p = programForKey(KCCShader_Position_hsl); p->reset(); loadDefaultShader(p, kCCShaderType_Position_hsl);

在 CCShaderCache.cpp 的 loadDefaultShader 中加入代码

case kCCShaderType_Position_hsl: p->initWithVertexShaderByteArray(ccPositionTextureColor_vert, ccPositionColorHSL_frag);p->addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position);p->addAttribute(kCCAttributeNameColor, kCCVertexAttrib_Color);p->addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords); break;

在 CCShaderCache.cpp 的 loadDefaultShaders中加入代码

p = new CCGLProgram(); loadDefaultShader(p, kCCShaderType_Position_hsl); m_pPrograms->setObject(p, KCCShader_Position_hsl); p->release();

步骤3.

在 CCSprite 类中 追加 HSL 接口

[cpp] view plaincopyvoid initHSL(); void drawHSL(); void setHSL(float h, float s, float l); void setH(float h); void setS(float s); void setL(float l); float getH(void){ return m_color_h;} float getS(void){ return m_color_s;} float getL(void){ return m_color_l;} [cpp] view plaincopyvoid CCSprite::initHSL() { if(m_use_hsl == false) { m_use_hsl = true; setShaderProgram(CCShaderCache::sharedShaderCache()->programForKey(KCCShader_Position_hsl)); hLocation = glGetUniformLocation( getShaderProgram()->getProgram(), "AddHue"); sLocation = glGetUniformLocation( getShaderProgram()->getProgram(), "AddSat"); lLocation = glGetUniformLocation( getShaderProgram()->getProgram(), "AddLig"); rLocation = glGetUniformLocation( getShaderProgram()->getProgram(), "AddRed"); gLocation = glGetUniformLocation( getShaderProgram()->getProgram(), "AddGreen"); bLocation = glGetUniformLocation( getShaderProgram()->getProgram(), "AddBlue"); aLocation = glGetUniformLocation( getShaderProgram()->getProgram(), "AddAlpha"); } } void CCSprite::drawHSL() { ccBlendFunc blend = getBlendFunc(); ccGLBlendFunc(blend.src, blend.dst); getShaderProgram()->use(); getShaderProgram()->setUniformsForBuiltins(); getShaderProgram()->setUniformLocationWith1f(hLocation, m_color_h); getShaderProgram()->setUniformLocationWith1f(sLocation, m_color_s); getShaderProgram()->setUniformLocationWith1f(lLocation, m_color_l); getShaderProgram()->setUniformLocationWith1f(rLocation, _displayedColor.r/.f); getShaderProgram()->setUniformLocationWith1f(gLocation, _displayedColor.g/.f); getShaderProgram()->setUniformLocationWith1f(bLocation, _displayedColor.b/.f); m_color_a = this->getOpacity() / .f; getShaderProgram()->setUniformLocationWith1f(aLocation, m_color_a); ccGLBindTexture2D( getTexture()->getName()); ccGLEnableVertexAttribs(kCCVertexAttribFlag_PosColorTex ); #define kQuadSize sizeof(m_sQuad.bl) long offset = (long)&m_sQuad; // vertex int diff = offsetof( ccV3F_C4B_T2F, vertices); glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, kQuadSize, (void*) (offset &#; diff)); // texCoods diff = offsetof( ccV3F_C4B_T2F, texCoords); glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, kQuadSize, (void*)(offset &#; diff)); // color diff = offsetof( ccV3F_C4B_T2F, colors); glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, kQuadSize, (void*)(offset &#; diff)); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); CC_INCREMENT_GL_DRAWS(1); } void CCSprite::setHSL(float h, float s, float l) { initHSL(); setH(h); setS(s); setL(l); } void CCSprite::setH(float h) { initHSL(); m_color_h = h; } void CCSprite::setS(float s) { initHSL(); m_color_s = s; } void CCSprite::setL(float l) { initHSL(); m_color_l = l; ccBlendFunc blend = getBlendFunc(); if(m_color_l > 0) blend.src = GL_SRC_ALPHA; else blend.src = GL_ONE; blend.dst = GL_ONE_MINUS_SRC_ALPHA; setBlendFunc(blend); }

在 CCSprite.cpp 的 updateBlendFunc中追加代码

if(m_use_hsl){ccBlendFunc blend = getBlendFunc();if(m_color_l > 0)blend.src = GL_SRC_ALPHA;elseblend.src = GL_ONE;blend.dst = GL_ONE_MINUS_SRC_ALPHA;setBlendFunc(blend);}

在 CCSprite.cpp 的 setTexture中追加代码

if(this->m_use_hsl){m_use_hsl = false;initHSL();}

在 CCSprite.cpp 的 draw 开头插入代码

if(m_use_hsl){drawHSL();return;}

步骤5.在cocos2dx 中添加自定义 shaders --- 改变 HSL 色调,饱和度, 亮度(cocos怎么用)

调用接口

[cpp] view plaincopy{ CCSprite* pSprite = CCSprite::create("Icon.png"); // -1 ~ 1 0无变化 pSprite->setS(-1); // position the sprite on the center of the screen pSprite->setPosition(ccp(visibleSize.width/2 &#; origin.x, visibleSize.height/2 &#; origin.y)); // add the sprite as a child to this layer this->addChild(pSprite, 0); }

-- ::| 分类: cocos2dx|举报|字号 订阅

步骤1.

准备 shaders文件- ccShad_Hsl.h

将它放入E:HSluZiLongcocos2d-x-2.2.1cocos2d-x-2.2.1cocos2dxshaders 目录下

步骤2.

在 ccShaders.h 中加入代码

extern CC_DLL const GLchar * ccPositionColorHSL_frag;extern CC_DLL const GLchar * ccPositionColorHSL_vert;

在 ccShaders.cpp 中加入代码

const GLchar * ccPositionColorHSL_frag =#include "ccShad_Hsl.h"

在 CCGLProgram.h 中定义

#define KCCShader_Position_hsl"KCCShader_Position_hsl"

在 CCShaderCache.cpp 中 追加枚举 kCCShaderType_Position_hsl,

在 CCShaderCache.cpp 的 reloadDefaultShaders中加入代码

p = programForKey(KCCShader_Position_hsl); p->reset(); loadDefaultShader(p, kCCShaderType_Position_hsl);

在 CCShaderCache.cpp 的 loadDefaultShader 中加入代码

case kCCShaderType_Position_hsl: p->initWithVertexShaderByteArray(ccPositionTextureColor_vert, ccPositionColorHSL_frag);p->addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position);p->addAttribute(kCCAttributeNameColor, kCCVertexAttrib_Color);p->addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords); break;

在 CCShaderCache.cpp 的 loadDefaultShaders中加入代码

p = new CCGLProgram(); loadDefaultShader(p, kCCShaderType_Position_hsl); m_pPrograms->setObject(p, KCCShader_Position_hsl); p->release();

步骤3.

在 CCSprite 类中 追加 HSL 接口

[cpp] view plaincopyvoid initHSL(); void drawHSL(); void setHSL(float h, float s, float l); void setH(float h); void setS(float s); void setL(float l); float getH(void){ return m_color_h;} float getS(void){ return m_color_s;} float getL(void){ return m_color_l;} [cpp] view plaincopyvoid CCSprite::initHSL() { if(m_use_hsl == false) { m_use_hsl = true; setShaderProgram(CCShaderCache::sharedShaderCache()->programForKey(KCCShader_Position_hsl)); hLocation = glGetUniformLocation( getShaderProgram()->getProgram(), "AddHue"); sLocation = glGetUniformLocation( getShaderProgram()->getProgram(), "AddSat"); lLocation = glGetUniformLocation( getShaderProgram()->getProgram(), "AddLig"); rLocation = glGetUniformLocation( getShaderProgram()->getProgram(), "AddRed"); gLocation = glGetUniformLocation( getShaderProgram()->getProgram(), "AddGreen"); bLocation = glGetUniformLocation( getShaderProgram()->getProgram(), "AddBlue"); aLocation = glGetUniformLocation( getShaderProgram()->getProgram(), "AddAlpha"); } } void CCSprite::drawHSL() { ccBlendFunc blend = getBlendFunc(); ccGLBlendFunc(blend.src, blend.dst); getShaderProgram()->use(); getShaderProgram()->setUniformsForBuiltins(); getShaderProgram()->setUniformLocationWith1f(hLocation, m_color_h); getShaderProgram()->setUniformLocationWith1f(sLocation, m_color_s); getShaderProgram()->setUniformLocationWith1f(lLocation, m_color_l); getShaderProgram()->setUniformLocationWith1f(rLocation, _displayedColor.r/.f); getShaderProgram()->setUniformLocationWith1f(gLocation, _displayedColor.g/.f); getShaderProgram()->setUniformLocationWith1f(bLocation, _displayedColor.b/.f); m_color_a = this->getOpacity() / .f; getShaderProgram()->setUniformLocationWith1f(aLocation, m_color_a); ccGLBindTexture2D( getTexture()->getName()); ccGLEnableVertexAttribs(kCCVertexAttribFlag_PosColorTex ); #define kQuadSize sizeof(m_sQuad.bl) long offset = (long)&m_sQuad; // vertex int diff = offsetof( ccV3F_C4B_T2F, vertices); glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, kQuadSize, (void*) (offset &#; diff)); // texCoods diff = offsetof( ccV3F_C4B_T2F, texCoords); glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, kQuadSize, (void*)(offset &#; diff)); // color diff = offsetof( ccV3F_C4B_T2F, colors); glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, kQuadSize, (void*)(offset &#; diff)); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); CC_INCREMENT_GL_DRAWS(1); } void CCSprite::setHSL(float h, float s, float l) { initHSL(); setH(h); setS(s); setL(l); } void CCSprite::setH(float h) { initHSL(); m_color_h = h; } void CCSprite::setS(float s) { initHSL(); m_color_s = s; } void CCSprite::setL(float l) { initHSL(); m_color_l = l; ccBlendFunc blend = getBlendFunc(); if(m_color_l > 0) blend.src = GL_SRC_ALPHA; else blend.src = GL_ONE; blend.dst = GL_ONE_MINUS_SRC_ALPHA; setBlendFunc(blend); }

在 CCSprite.cpp 的 updateBlendFunc中追加代码

if(m_use_hsl){ccBlendFunc blend = getBlendFunc();if(m_color_l > 0)blend.src = GL_SRC_ALPHA;elseblend.src = GL_ONE;blend.dst = GL_ONE_MINUS_SRC_ALPHA;setBlendFunc(blend);}

在 CCSprite.cpp 的 setTexture中追加代码

if(this->m_use_hsl){m_use_hsl = false;initHSL();}

在 CCSprite.cpp 的 draw 开头插入代码

if(m_use_hsl){drawHSL();return;}

步骤5.

调用接口

[cpp] view plaincopy{ CCSprite* pSprite = CCSprite::create("Icon.png"); // -1 ~ 1 0无变化 pSprite->setS(-1); // position the sprite on the center of the screen pSprite->setPosition(ccp(visibleSize.width/2 &#; origin.x, visibleSize.height/2 &#; origin.y)); // add the sprite as a child to this layer this->addChild(pSprite, 0); }

Cocos2dx的截屏与遮罩 Cocos2dx3.2截取精灵部分;boolHelloWorld::init(){//////////////////////////////if(!Layer::init()){returnfalse;}SizevisibleSize=Director::getInstance()-getVisibleSize();Vec2origin=Director::getInst

cocos2dx菜单重叠按钮实现按层优先选择及透明过滤 众所周知,在cocos2d-x中,通过CCMenu(抱歉,笔者至今任然在用2.2.2的版本)创建的菜单,如果遇到数个按钮有重叠,当用户点击重叠区域(包括PNG图标中

cocos2dx中滚动界面和小滚动条同步的实现 在游戏中,经常会遇到滚动界面,或者滚动列表,在滚动时,为了给用户一个更好的体验,我们会想到在滚动界面的旁边加上一个小小的滚动条,让这

标签: cocos怎么用

本文链接地址:https://www.jiuchutong.com/biancheng/368960.html 转载请保留说明!

上一篇:Cocos2dx CCSprite CCSpriteFrame CCTexture2D CCAnimation学习总结

下一篇:Cocos2dx的截屏与遮罩(cocos2d schedule)

  • 收到其他与经营活动有关的现金是什么意思
  • 固定资产清理亏损的账务处理
  • 非员工私车公用怎么进行账务处理
  • 租入厂房再转租账要怎么做
  • 消防公司支付劳务费会计处理
  • 工资表多扣个税怎么做账
  • 工程结算方式分为
  • 多交的增值税怎么退
  • 短期借款会计科目使用说明
  • 未开票收入结转成本年利润怎么算
  • 退货重新下单要付款吗
  • 库存半成品属于什么会计科目
  • 取得增值税专用发票是否可以抵扣
  • 在建工程全部费用化
  • 企业短期贷款进什么科目
  • 发票专用章备案需要什么资料
  • 机构股东入股资金流向
  • 凭证类别不合法怎么处理
  • 金融资产交易中心是干嘛的
  • 大宗物资吧
  • 专票已经认证能作废吗
  • 工资一直计提但是未发有影响吗
  • 长期股权投资的账务处理
  • 上年度的发票还能红冲吗
  • 冲减多计提税费
  • 错账查找的方法
  • linux系统应对攻击的常用防御手段的描述
  • 预交税款分录
  • windows商店如何切换地区
  • 免费投放资产收益的平台
  • php用户会员系统
  • 建筑业挂靠经营行为有什么涉税风险?
  • CVE-2016-1000027分析
  • 公司土地被政府占用
  • 委托贷款业务是资产业务吗
  • Smarty3配置及入门语法
  • 深度学习:图像去雨网络实现Pytorch (二)一个简单实用的基准模型(PreNet)实现
  • 施工企业工人工资付给包工头老板需要写什么模板
  • 人力资源增加什么资金积累
  • 什么叫财政补助收入
  • 新会计准则哪一年颁布
  • 企业月末在产品数量变化不大时,最适宜
  • 做私活要收个人所得税吗
  • 研发支出资本化计入什么科目
  • sql server临时表的生命周期
  • 所有者权益和负债的主要区别
  • 固定资产对外投资通过固定资产清理吗
  • 买一件商品赠送两个商品
  • 建筑工程劳务分包合同范本2019
  • 企业所得税虚报成本多少属于犯罪
  • 房地产开发企业资质管理规定
  • 库存商品品种太多如何算成本
  • 主营业务收入的t型账户怎么写
  • 存储过程实现业务逻辑
  • 提高sql执行效率的方法
  • 怎样提升win10开机速度
  • ghost安装盘的制作
  • windows没网络是怎么回事
  • win10屏幕亮度怎么调节快捷键
  • ubuntu16.04输入法
  • vi编辑器的使用
  • windows8笔记本电脑
  • 怎样设置Win XP下安装打印机驱动程序
  • linux ls命令什么意思
  • 在linux操作系统中
  • 如何汉化游戏
  • win7系统安装程序正在启动一直转圈圈
  • js字符串includes
  • python import同一目录的其他文件
  • unity 加载文件 卡顿
  • uploadify文件上传
  • docker 开源项目
  • android数据库使用
  • jquery是基于java的吗
  • JavaScript charCodeAt方法入门实例(用于取得指定位置字符的Unicode编码)
  • JavaScript For Beginners(转载)
  • 税控专用设备包括哪些
  • 办公厅机构设置方案
  • 未开票企业怎么做账
  • 艾地盟预混料怎么样
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设