由于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精灵变灰的更多相关文章

  1. [原]quick2.25让描边闪起来

    本文教大家如何使用shader让描边动起来.实质就是间隔一定时间改变描边的颜色.难点:如何通过程序把颜色传给shader.想在quick2.25里面尝试的朋友,参考quick2.25精灵变灰配置一下环 ...

  2. 关于cocos2d-x精灵加亮及变灰效果

    //根据现有CCSprite,变亮和变灰 static CCSprite* graylightWithCCSprite(CCSprite* oldSprite,bool isLight) { //CC ...

  3. 【全面完美方案】iPhone 4S WiFi变灰 DIY修复方式

    这是我在一位台湾网友usaretama发表的一篇帖子中看到的,原帖我发表在维维网 如果你有WiFi开关变灰不能切换.WiFi遇到搜不到AP或搜到了连不上,那您就要注意这篇了. 家人的 iPhone 4 ...

  4. EasyUI-右键菜单变灰不可用效果

    使用过EasyUI的朋友想必都知道疯狂秀才写的后台界面吧,作为一个初学者我不敢妄自评论它的好坏,不过它确实给我们提供了一个很好框架,只要在它的基础上进行修改,基本上都可以满足我们开发的需要. 知道“疯 ...

  5. opengl之vsh、fsh简易介绍+cocos2dx 3.0 shader 变灰

    认识着色器 理解OpenGL渲染管线,对于学习OpenGL非常重要.下面是OpenGL渲染管线的示意图:(图中淡蓝色区域是可以编程的阶段) 此图是从wiki中拿过来的,OpenGL的渲染管线主要包括: ...

  6. eclipse中访问不了tomcat首页server Locations变灰无法编辑

    eclipse中访问不了tomcat首页server Locations变灰无法编辑 2014年07月25日 14:37:21 wuha0 阅读数:19139更多 个人分类: servlet   解决 ...

  7. Jquery 实现表单提交按钮变灰,防止多次点击提交重复数据

    表单提交时候我们应该控制提交按钮,不能点击多次进行数据的重复提交.要不然就会有冗余的重复的数据在系统中,造成系统出现数据垃圾.jQuery很简单的就可以实现对表单提交按钮控制,下面就是相关的例子和代码 ...

  8. cocos2d 3.X Shader 变暗和变灰

    转自http://www.waitingfy.com/archives/1741 1.为了节约一张图引发的Shader使用  我们注意到这个游戏当中经常使用一些按钮,美术会给两张图,一张稍微暗点,表示 ...

  9. 怎么让让整个HTML页面变灰

    怎么让让整个HTML页面变灰 其实很简单,我们只需要一句话. html {filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1 ...

随机推荐

  1. mysql语句:批量更新多条记录的不同值[转]

    mysql语句:批量更新多条记录的不同值 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 帮助 1 UPDATE mytable SET myfield = 'value' WHERE ...

  2. 安装SQL Server 2008 R2 Enterprise错误:'' is not a valid login or you do not have permission

    今天安装SQL Server时遇到一个恶心的Bug. ------------------------------------------------------------------------- ...

  3. [Xamarin] 關於Internal Storage ,存取App內部使用資料 (转帖)

    最近在開發App,會使用到必須要處理一些App所使用的資料,上網路查一下Android 得作法,包含我自己也實作了一下,可能是因為對Java || Android 不是很孰悉,常常錯在 java.la ...

  4. EntityFramework 中支持 BulkInsert 扩展

    本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 前言 很显然,你应该不至于使用 EntityFramework 直接插入 10W 数据到数据库中,那 ...

  5. 成功安装mysql后,为何服务管理器里找不到MYSQL服务名

    1.打开cmd,切换到mysql的bin目录下 2. D:\Program Files\MySQL5.1\bin>mysqld.exe -installService successfully ...

  6. 博客还是搬到csdn吧~

    从csdn转到博客园是因为博客园开放了博客接口,方便发博客,再者博客样式也比较多,排版兼容性也较好. but, 博客园的链接在多个群里进行了宣传,当时大概有2000多的访问量,但是一个月过去了,现在还 ...

  7. java集合练习——题目

    2.已知有十六支男子足球队参加2008 北京奥运会.写一个程序,把这16 支球队随机分为4 个组.采用List集合和随机数 2008 北京奥运会男足参赛国家: 科特迪瓦,阿根廷,澳大利亚,塞尔维亚,荷 ...

  8. Autoprefixer处理CSS3属性前缀

    http://www.w3cplus.com/css3/autoprefixer-css-vender-prefixes.html

  9. chrome诡异的Provisional headers are shown

    昨天吐槽了cocos2d-js的问题,所以就准备调研几个其它HTML5引擎,发现PIXI性能极高,但是没有音频.而Phaser.js是在PIXI.js的基础之上进行的封装.而国内有一家公司,开发一个叫 ...

  10. ASP 中 Cookies 的 Expires 属性的设置(JS版本)

    直接上代码,代码中有注释 <%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%> <% var numVisi ...