由于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. SQLSERVER性能监控级别步骤

    SQLSERVER性能监控级别步骤 下面先用一幅图描述一下有哪些步骤和顺序 1.识别瓶颈 识别瓶颈的原因包括多个方面,例如,资源不足,需要添加或升级硬件: 工作负荷在同类资源之间分布不均匀,例如,一个 ...

  2. SQLServer DBA 三十问(加强版)

    距离最初发布SQLServer DBA 三十问 已有一年多了,大家对其中的某些问题讨论比较激烈,要回答出来这些问题需要比较扎实的SQLServer 基础和一定的实际操作经验,如果你试着去回答其中的问题 ...

  3. 小米Web前端JavaScript面试题

    面试题目 一. 请定义这样一个函数 function repeat (func, times, wait) { } 这个函数能返回一个新函数,比如这样用 var repeatedFun = repea ...

  4. dubbo的安装和使用

    dubbo的安装和使用

  5. [Python] 中文编码问题:raw_input输入、文件读取、变量比较等str、unicode、utf-8转换问题

    最近研究搜索引擎.知识图谱和Python爬虫比较多,中文乱码问题再次浮现于眼前.虽然市面上讲述中文编码问题的文章数不胜数,同时以前我也讲述过PHP处理数据库服务器中文乱码问题,但是此处还是准备简单做下 ...

  6. JProfiler8 注册码序列号

    JProfiler_SN_8_x.txt 按默认选择"Single or evaluation license" Name 和 Company 随意 --------------- ...

  7. atitit.js 各版本 and 新特性跟浏览器支持报告

    atitit.js 各版本 and 新特性跟浏览器支持报告 一个完整的JavaScript实现是由以下3个不同部分组成的 •核心(ECMAScript)--JavaScript的核心ECMAScrip ...

  8. iOS开发拓展篇-XMPP简单介绍

    iOS开发拓展篇-XMPP简单介绍 一.即时通讯简单介绍 1.简单说明 即时通讯技术(IM)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双 ...

  9. nginx的反向代理和负载均衡的区别

    反向代理,是把一些静态资源存储在服务器上,当用户有请求的时候,就直接返回反向代理服务器上的资源给用户,而如果反向代理服务器上没有的资源,就转发给后面的负载均衡服务器,负载均衡服务器再将请求分发给后端的 ...

  10. C#WebBrowser控件使用教程与技巧收集--苏飞收集

    C#WebBrowser控件使用教程与技巧收集--苏飞收集 先来看看常用的方法 Navigate(string urlString):浏览urlString表示的网址 Navigate(System. ...