[原]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 ...
随机推荐
- mysql语句:批量更新多条记录的不同值[转]
mysql语句:批量更新多条记录的不同值 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 帮助 1 UPDATE mytable SET myfield = 'value' WHERE ...
- 安装SQL Server 2008 R2 Enterprise错误:'' is not a valid login or you do not have permission
今天安装SQL Server时遇到一个恶心的Bug. ------------------------------------------------------------------------- ...
- [Xamarin] 關於Internal Storage ,存取App內部使用資料 (转帖)
最近在開發App,會使用到必須要處理一些App所使用的資料,上網路查一下Android 得作法,包含我自己也實作了一下,可能是因為對Java || Android 不是很孰悉,常常錯在 java.la ...
- EntityFramework 中支持 BulkInsert 扩展
本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 前言 很显然,你应该不至于使用 EntityFramework 直接插入 10W 数据到数据库中,那 ...
- 成功安装mysql后,为何服务管理器里找不到MYSQL服务名
1.打开cmd,切换到mysql的bin目录下 2. D:\Program Files\MySQL5.1\bin>mysqld.exe -installService successfully ...
- 博客还是搬到csdn吧~
从csdn转到博客园是因为博客园开放了博客接口,方便发博客,再者博客样式也比较多,排版兼容性也较好. but, 博客园的链接在多个群里进行了宣传,当时大概有2000多的访问量,但是一个月过去了,现在还 ...
- java集合练习——题目
2.已知有十六支男子足球队参加2008 北京奥运会.写一个程序,把这16 支球队随机分为4 个组.采用List集合和随机数 2008 北京奥运会男足参赛国家: 科特迪瓦,阿根廷,澳大利亚,塞尔维亚,荷 ...
- Autoprefixer处理CSS3属性前缀
http://www.w3cplus.com/css3/autoprefixer-css-vender-prefixes.html
- chrome诡异的Provisional headers are shown
昨天吐槽了cocos2d-js的问题,所以就准备调研几个其它HTML5引擎,发现PIXI性能极高,但是没有音频.而Phaser.js是在PIXI.js的基础之上进行的封装.而国内有一家公司,开发一个叫 ...
- ASP 中 Cookies 的 Expires 属性的设置(JS版本)
直接上代码,代码中有注释 <%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%> <% var numVisi ...