Cocos2d-js中使用Shader方法

以一个简单的波纹效果为例:

一、引入shader脚本文件。

1、vertex shader

attribute vec4 a_position;
attribute vec2 a_texCoord;
attribute vec4 a_color;

varying vec4 v_fragmentColor;
varying vec2 v_texCoord;

void main()
{
    gl_Position = CC_PMatrix * a_position;
    v_fragmentColor = a_color;
    v_texCoord = a_texCoord;
}

2、fragment shader

varying vec2 v_texCoord;

#define M_PI 3.1415926535897932384626433832795

void main() {
    vec2 coord = v_texCoord;
    coord.x += (sin(coord.y * 10.0 + CC_Time[1] * 10.0) / 30.0);
    gl_FragColor = texture2D(CC_Texture0, coord);
}

3、cocos2d-js code

var sprite = this.sprite = new cc.Sprite("res/demo.png");
sprite.attr({
        x: cc.winSize.width / 2,
        y: cc.winSize.height/ 2
});
this.addChild(sprite);

var shader = this.shader = new cc.GLProgram(‘res/test.vsh‘, ‘res/test.fsh‘);
shader.link();
shader.updateUniforms();

sprite.shaderProgram = shader;

二、直接嵌入shader脚本

      var vsh = "\n" +
            "attribute vec4 a_position;\n" +
            "attribute vec2 a_texCoord;\n" +
            "attribute vec4 a_color;\n" +
            "varying vec4 v_fragmentColor;\n" +
            "varying vec2 v_texCoord;\n" +
            "void main()\n" +
            "\n{\n" +
            "   gl_Position = CC_PMatrix * a_position;\n" +
            "   v_fragmentColor = a_color;\n" +
            "   v_texCoord = a_texCoord;\n" +
            "}";

       var fsh = "\n" +
            "varying vec2 v_texCoord;\n" +
            "void main()\n" +
            "\n{\n" +
            "   vec2 coord = v_texCoord;\n" +
            "   coord.x += (sin(coord.y * 10.0 + CC_Time[1] * 10.0) / 30.0);\n" +
            "   gl_FragColor = texture2D(CC_Texture0, coord);\n" +
            "}";

        var sprite = this.sprite = new cc.Sprite("res/grossini.png");
        var shader = new cc.GLProgram();
        if(shader.initWithString(vsh, fsh)){
            shader.addAttribute(cc.ATTRIBUTE_NAME_COLOR, cc.VERTEX_ATTRIB_COLOR);
            shader.addAttribute(cc.ATTRIBUTE_NAME_POSITION, cc.VERTEX_ATTRIB_POSITION);
            shader.addAttribute(cc.ATTRIBUTE_NAME_TEX_COORD, cc.VERTEX_ATTRIB_TEX_COORDS);
            shader.link();
            shader.updateUniforms();

            sprite.shaderProgram = shader;
        }
        sprite.attr({
            x: cc.winSize.width / 2,
            y: cc.winSize.height/ 2
        });
        this.addChild(sprite);
时间: 2024-10-06 00:16:38

Cocos2d-js中使用Shader方法的相关文章

php学习笔记(JS中的常见方法)

JS中的常见方法: 1.日期时间函数(需要用变量调用): var b = new Date(); //获取当前时间 b.getTime() //获取时间戳 b.getFullYear() //获取年份 b.getMonth()+1; //获取月份 b.getDate() //获取天 b.getHours() //获取小时 b.getMinutes() //获取分钟 b.getSeconds() //获取秒数 b.getDay() //获取星期几 b.getMilliseconds() //获取毫

js中使用eval()方法将字符串转换成日期格式、并获取指定时间的日期

1.在js中eval()方法将字符串格式数据转换成日期格式 function getDate(strDate) {         //strDate为需要转换成日期格式的字符串         var date = eval('new Date(' + strDate.replace(/\d+(?=-[^-]+$)/,                 function (a) { return parseInt(a, 10) - 1; }).match(/\d+/g) + ')');    

JS中通过call方法实现继承

讲解都写在注释里面了,有不对的地方请拍砖,谢谢! <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>JS通过call方法实现继承</title> </head> <body> <script type="text/javascript"> /* js中的继承有多种实现方式,今天我们讨论下通过call方法实现的继承. 此

Js中sort(sortfun)方法

1 <meta charset="utf-8" /> 2 3 <script language="javascript"> 4 5 /** 6 * @date 2014-10-23 11:17:04 7 * @via http://www.jb51.net/article/4168.htm 8 * @topic Js中sort(sortfun)方法 9 * @return 一个元素已经进行了排序的 Array 对象. 10 * @sortfu

笔记-[6]-js中事件绑定方法的总结

js中的两种对象事件绑定方法: 1:常用的如:div.onclick=function(){...}; 2:通过系统方法绑定事件: 非IE:addEventListener('事件名[不加on]',function(){},false[或者true]) IE:attachEvent('事件名[加on]',function(){}); 通过系统方法绑定事件可以让对象可以绑定相同的事件并且执行不同的操作,如果使用第一种方法绑定多个相同的事件,最后一个事件会覆盖前面所有的事件. 在addEventLi

JavaScript开发之旅(2):JS中的tostring()方法

看到一个toString()方法,在JS中,定义的所有对象都具有toString()方法. 定义和用法 toString() 方法可把一个逻辑值转换为字符串,并返回结果. 语法 booleanObject.toString(); 返回值 根据原始布尔值或者 booleanObject 对象的值返回字符串 "true" 或 "false". 抛出 如果调用该方法的对象不是 Boolean,则抛出异常 TypeError. 创建一个 Boolean 对象,并把它转换成字

字符串方法,js中的数组方法,ES5新增的数组方法,以及jQuery中的数组方法

说明:本片主要对比介绍与数组操作相关的方法 (一)字符串方法(String对象方法) indexOf() //检索字符串 lastIndexOf() //从后向前搜索字符串 match() //找到一个或多个正则表达式的匹配 replace() //替换与正则表达式匹配的子串 search() //检索与正则表达式相匹配的值 slice() //提取字符串的片断,并在新的字符串中返回被提取的部分 split() //把字符串分割为字符串数组 substr() //从起始索引号提取字符串中指定数目

JS中函数调用的方法

JavaScript 函数有 4 种调用方式.每种方式的不同方式在于 this 的初始值. 1.作为一个函数调用 function myFunction(a, b) { return a* b; } myFunction(10, 2); // myFunction(10, 2) 返回 20 或 function myFunction() { return this; } myFunction(); // 返回 window对象 this为window对象. 2.作为方法调用 var myObje

js中的tostring()方法

今天看JS学习资料,看到一个toString()方法,在JS中,定义的所有对象都具有toString()方法. Number类型的toString()方法比较特殊,有默认模式和基模式两种. 默认模式的例子: var num1 = 10; var num2 = 10.0; alert(num1.toString());//输出10 alert(num2.toString());//输出10 无论你用什么表示法声明数字,默认模式只是按十进制返回. 基模式的例子: var num1 = 10; ale

关于js中使用close方法无法关闭firefox浏览器

今天遇到一个问题就是在js中使用window.close()方法无法关闭Firefox: 浏览器版本: firefox IE 一句简单的代码可实现浏览器的关闭 1 <p onclick="javascript:window.close()">关闭</p> 但测试发现: IE能正常弹出窗口询问是否关闭窗口 而Firefox点击之后则无任何反应 难道Firefox不支持close()关闭? 我们在来测试一下使用close能不能关闭open()打开的窗口呢? 1 /*