cocos2dx-js 学习笔记 shader

將遊戲從 Cocos2d-x 3.2 移植至 Cocos2d-js 3.0 時,
遇到不少坑,所以記錄起來,
希望可以幫助其他同學少走一點冤枉路!

OS: Windows 7 64bit
IDE: Cocos Code IDE 1.0.0 RC2

1.首先先用 Cocos Code IDE 建立出預設的 CocosJSGame 專案,
這應該很簡單,不懂的同學先去官網看看教程吧!

2.在 resource.js 上指定要測試的shader檔案,
分別是 HelloShader.vsh 以及HelloShader.fsh ,
這二個檔案需放在res資料夾下,詳細內容後面會介紹!

var res = {
    HelloWorld_png : "res/HelloWorld.png",
    CloseNormal_png : "res/CloseNormal.png",
    CloseSelected_png : "res/CloseSelected.png",
    HelloShader_vsh : "res/HelloShader.vsh",
    HelloShader_fsh : "res/HelloShader.fsh"
};
var g_resources = ];
for (var i in res) {
    g_resources.push(res);
}

```


3.在 app.js 找到 HelloWorld_png 的 sprite ,
 設定 shader 相關資料。

        var Helloshader = new cc.GLProgram(res.HelloShader_vsh,res.HelloShader_fsh);
         Helloshader.addAttribute(cc.ATTRIBUTE_NAME_POSITION, cc.VERTEX_ATTRIB_POSITION);
         Helloshader.addAttribute(cc.ATTRIBUTE_NAME_COLOR, cc.VERTEX_ATTRIB_COLOR);
         Helloshader.addAttribute(cc.ATTRIBUTE_NAME_TEX_COORD, cc.VERTEX_ATTRIB_TEX_COORDS);
         Helloshader.link();
         Helloshader.updateUniforms();
         this.sprite.setShaderProgram(Helloshader);

```


4.終於進入重頭戲了,
 就從shader最簡單的「灰階」來試試吧!
 開始來寫 vsh 跟 fsh 的內容!
 這裡也是最大的坑呀!!!
 因為在 web 與 jsb 的寫法竟然得不一樣???
 雖然差異不大,但同學們得要注意一下!

 vsh (web版本寫法)
attribute vec2     a_texCoord;
attribute vec4     a_position;
varying vec2    v_texCoord;
void main()
{
    v_texCoord  = a_texCoord;
    gl_Position = (CC_PMatrix * CC_MVMatrix) * a_position;
}

```

 vsh (jsb版本寫法)
 與web版差異就是得拿掉CC_MVMatrix 
 不然圖片就不會出現你想要的位置!
attribute vec2     a_texCoord;
attribute vec4     a_position;
varying vec2    v_texCoord;
void main()
{
    v_texCoord  = a_texCoord;
    gl_Position = CC_PMatrix * * a_position;
}

```


 fsh (web版本寫法)
uniform sampler2D CC_Texture0;
varying vec2  v_texCoord;
void main()
{
    vec4 v_orColor = texture2D(CC_Texture0, v_texCoord);
    float gray = dot(v_orColor.rgb, vec3(0.299, 0.587, 0.114));
    gl_FragColor = vec4(gray, gray, gray, v_orColor.a);
}

```


 fsh (jsb版本寫法)
 與web版差異就是得拿掉 uniform sampler2D CC_Texture0;   
 不然就會crash哦!
varying vec2  v_texCoord;
void main()
{
    vec4 v_orColor = texture2D(CC_Texture0, v_texCoord);
    float gray = dot(v_orColor.rgb, vec3(0.299, 0.587, 0.114));
    gl_FragColor = vec4(gray, gray, gray, v_orColor.a);
}

```


太好啦!
在web與jsb環境下,
shader 終於可以正常運作!

只有這點坑嗎?
當然~不只~

有點晚了,先睡覺去,
剩下的內容下次再來寫吧!

感谢国庆期间还在研究cocos2d-js。

谢谢你的问题反馈,看来这个部分我们的测试还存在遗漏,下个版本一定会讲这个差异部分也修正过来。

如果可以修正真是太感謝了,
另外Shader還存在著的一個問題:
CC_Time、CC_CosTime、CC_SinTIme
在JSB版本可以正常運作,
而在WEB版本並不會依時間而變動哦!

— Begin quote from ____

引用第1楼linshun于2014-10-04 12:08发表的 :
感谢国庆期间还在研究cocos2d-js。

谢谢你的问题反馈,看来这个部分我们的测试还存在遗漏,下个版本一定会讲这个差异部分也修正过来。
http://www.cocoachina.com/bbs/job.php?action=topost&tid=233398&pid=1068701

— End quote

你好,最近一直在研究cocos2djs的shader,发现官网demo OpenGLTest里面的例子里说 要扩展Node类来实现调用draw函数,但是发现这只是在web端起作用,发布到android、ios端或者win32端都没有调用draw函数!!最近在写一个光效的shader,里面要调用render类来进行渲染,cocos2dx c++版的render直接可以从draw函数的中获取到,但是js版的不知道怎么去获取这个render,版主,请问这个render在js版是被什么给代替了吗?要怎么才能获取到呢??

你好,最近一直在研究cocos2djs的shader,发现官网demo OpenGLTest里面的例子里说 要扩展Node类来实现调用draw函数,但是发现这只是在web端起作用,发布到android、ios端或者win32端都没有调用draw函数!!最近在写一个光效的shader,里面要调用render类来进行渲染,cocos2dx c++版的render直接可以从draw函数的中获取到,但是js版的不知道怎么去获取这个render,版主,请问这个render在js版是被什么给代替了吗?要怎么才能获取到呢??

1赞