[原]quick2.25精灵变灰
由于quick2.25没有导出shader相应的接口,所以2.25无法直接使用shader。
本文简单介绍如何导出相应接口,同时教大家使用shader 实现精灵变灰
一、编写静态函数,以供导出使用(直接参考3.2版本的)
2.25的GLProgram是对应操作shader的类。
在GLProgram.h声明以下两个函数
static CCGLProgram* createWithByteArrays(const char* vShaderByteArray, const char* fShaderByteArray);
static CCGLProgram* createWithFilenames(const char* vShaderFilename, const char* fShaderFilename);
在GLProgram.cpp添加以下两个函数
CCGLProgram* CCGLProgram::createWithByteArrays(const char* vShaderByteArray, const char* fShaderByteArray)
{
CCGLProgram* ret = new CCGLProgram();
if(ret && ret->initWithVertexShaderByteArray(vShaderByteArray, fShaderByteArray)) {
ret->autorelease();
return ret;
}
CC_SAFE_DELETE(ret);
return nullptr;
}
CCGLProgram* CCGLProgram::createWithFilenames(const char* vShaderFilename, const char* fShaderFilename)
{
auto ret = new CCGLProgram();
if(ret && ret->initWithVertexShaderFilename(vShaderFilename, fShaderFilename)) {
ret->autorelease();
return ret;
}
CC_SAFE_DELETE(ret);
return nullptr;
}
二、编写导出使用的.tolua脚本
在quick-2.2.5-plus\lib\luabinding\cocos2dx\draw_nodes下新建CCGLProgram.tolua,复制GLProgram.h下的public方法到CCGLProgram.tolua。具体导出注意事项参考
class CCGLProgram : public CCObject
{
static CCGLProgram* createWithByteArrays(const char* vShaderByteArray, const char* fShaderByteArray);
static CCGLProgram* createWithFilenames(const char* vShaderFilename, const char* fShaderFilename);
void addAttribute(const char* attributeName, GLuint index);
。。。。。。。。。。。。。。。。。。。。。
const GLuint getProgram() { return m_uProgram; }
}
在quick-2.2.5-plus\lib\luabinding\cocos2dx\Cocos2d.tolua 里面添加$pfile "cocos2dx/draw_nodes/CCGLProgram.tolua"
在命令行执行quick-2.2.5-plus\lib\luabinding\build.bat,检查quick-2.2.5-plus\lib\cocos2d-x\scripting\lua\cocos2dx_support\LuaCocos2d.cpp是否生成CCGLProgram相关绑定函数
三、开始使用shader
精灵变灰实例:
//gray.vsh 顶点shader
attribute vec4 a_position;
attribute vec2 a_texCoord;
attribute vec4 a_color;
#ifdef GL_ES
varying lowp vec4 v_fragmentColor;
varying mediump vec2 v_texCoord;
#else
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
#endif
void main()
{
gl_Position = CC_MVPMatrix * a_position;
v_fragmentColor = a_color;
v_texCoord = a_texCoord;
} //gray.fsh 片段shader
#ifdef GL_ES
precision mediump float;
#endif
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
uniform sampler2D CC_Texture0;
uniform int grayFlag; //控制变灰和恢复
void main(void)
{
vec4 c = texture2D(CC_Texture0, v_texCoord);
if (grayFlag >0)
{
float gray = dot(c.rgb,vec3(0.299,0.587,0.114));
gl_FragColor.xyz = vec3(gray,gray,gray);
}
else
{
gl_FragColor.xyz = c.rgb;
}
gl_FragColor.w = c.w;
}
使用shader:
local pProgram
self.sp = display.newSprite("img_248.png"):addTo(self)
self.sp:setPosition(, )
self:darkNode(self.sp)
self.sp:setTouchEnabled(true)
self.sp:addNodeEventListener(cc.NODE_TOUCH_EVENT,
function(event)
if event.name == "began" then
if not self.dark then
self.dark = true
local grayFlag = pProgram:getUniformLocationForName("grayFlag");
pProgram:use()
pProgram:setUniformLocationWith1i(grayFlag,1.0) --变灰
else
local grayFlag = pProgram:getUniformLocationForName("grayFlag");
pProgram:use()
pProgram:setUniformLocationWith1i(grayFlag,) --恢复
self.dark = false
end
end
end) function MainScene:darkNode(node)
local pProgram = CCGLProgram:createWithFilenames("res/shader/gray.vsh","res/shader/gray.fsh")
pProgram:addAttribute("a_position", ) --对应vs里面的顶点坐标
pProgram:addAttribute("a_color", ) --对应vs里面的顶点颜色
pProgram:addAttribute("a_texCoord", )--对应vs里面的顶点纹理坐标
pProgram:link() -- 因为绑定了属性,所以需要link一下,否则vs无法识别属性
pProgram:updateUniforms() -- 绑定了纹理贴图
node:setShaderProgram(pProgram) end
效果:
[原]quick2.25精灵变灰的更多相关文章
- [原]quick2.25让描边闪起来
本文教大家如何使用shader让描边动起来.实质就是间隔一定时间改变描边的颜色.难点:如何通过程序把颜色传给shader.想在quick2.25里面尝试的朋友,参考quick2.25精灵变灰配置一下环 ...
- 关于cocos2d-x精灵加亮及变灰效果
//根据现有CCSprite,变亮和变灰 static CCSprite* graylightWithCCSprite(CCSprite* oldSprite,bool isLight) { //CC ...
- 【全面完美方案】iPhone 4S WiFi变灰 DIY修复方式
这是我在一位台湾网友usaretama发表的一篇帖子中看到的,原帖我发表在维维网 如果你有WiFi开关变灰不能切换.WiFi遇到搜不到AP或搜到了连不上,那您就要注意这篇了. 家人的 iPhone 4 ...
- EasyUI-右键菜单变灰不可用效果
使用过EasyUI的朋友想必都知道疯狂秀才写的后台界面吧,作为一个初学者我不敢妄自评论它的好坏,不过它确实给我们提供了一个很好框架,只要在它的基础上进行修改,基本上都可以满足我们开发的需要. 知道“疯 ...
- opengl之vsh、fsh简易介绍+cocos2dx 3.0 shader 变灰
认识着色器 理解OpenGL渲染管线,对于学习OpenGL非常重要.下面是OpenGL渲染管线的示意图:(图中淡蓝色区域是可以编程的阶段) 此图是从wiki中拿过来的,OpenGL的渲染管线主要包括: ...
- eclipse中访问不了tomcat首页server Locations变灰无法编辑
eclipse中访问不了tomcat首页server Locations变灰无法编辑 2014年07月25日 14:37:21 wuha0 阅读数:19139更多 个人分类: servlet 解决 ...
- Jquery 实现表单提交按钮变灰,防止多次点击提交重复数据
表单提交时候我们应该控制提交按钮,不能点击多次进行数据的重复提交.要不然就会有冗余的重复的数据在系统中,造成系统出现数据垃圾.jQuery很简单的就可以实现对表单提交按钮控制,下面就是相关的例子和代码 ...
- cocos2d 3.X Shader 变暗和变灰
转自http://www.waitingfy.com/archives/1741 1.为了节约一张图引发的Shader使用 我们注意到这个游戏当中经常使用一些按钮,美术会给两张图,一张稍微暗点,表示 ...
- 怎么让让整个HTML页面变灰
怎么让让整个HTML页面变灰 其实很简单,我们只需要一句话. html {filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1 ...
随机推荐
- 在CS代码页获取input输入框内肉----.net学习点滴
想在后台cs页面得到前台页面aspx中html控件input输入的值.通过访问input输入框的name属性值获取. 解决方法如下: 1.用Request["user"].toSt ...
- Common Scenarios to avoid with DataWarehousing
Database Design Rule Description Value Source Problem Description 1 Excessive sorting and RID lookup ...
- Android 5.x特性概览四
上节,我们说了palatte及其特性,这里我们介绍Android 5.x的另一个特性视图与阴影. 在第一节,我们就提到了Material Design 一大特性就是就是扁平化,倘若说 iOS 的扁平化 ...
- 2014年市场需求排名前10的编程语言 - 生命的延续是 BI
开篇介绍 2014年就快收尾了,Team 内部每人都会准备一些 Tech Talk 的内容,技术方面的,咨询方面的都可以.我就准备了一些有关 BI 排名,BI 报表排名,包括各种技术编程语言等相关排名 ...
- Unity3D——键盘控制移动
public float speed = 6f; Vector3 movement; void FixedUpdate () { float h = Input.GetAxisRaw("Ho ...
- jenkins 插件开发资料
jenkins plugin 开发:documenthttp://hudson-ci.org/docs/index.htmlhttps://wiki.jenkins-ci.org/display/JE ...
- 免费好用的web应用托管平台
1.前言 曾经很久以前,想找一个免费的空间部署一个属于自己的技术博客真是太难了,使用过SAE,但是很快就面临收费了,后面也就不了了之了.目前自己又找到一个免费的PAAS平台,可以部署各种语言的web应 ...
- AngularJS快速入门指南01:导言
AngularJS使用新的attributes扩展了HTML AngularJS对单页面应用的支持非常好(SPAs) AngularJS非常容易学习 现在就开始学习AngularJS吧! 关于本指南 ...
- Spring对象绑定与类型转换
Spring对象绑定与类型转换 Spring的框架体系中,到处充斥着对象绑定从bean的初始化autowired属性,SpringMvc 中对对象的绑定等.Spring对象绑定和类型转换在Spring ...
- HtmlDocument
HtmlDocument HtmlDocument类对应着一个HTML文档代码.它提供了创建文档,装载文档,修改文档等等一系列功能,来看看它提供的功能. 一.属性 int CheckSum { get ...