將遊戲從 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 終於可以正常運作! 只有這點坑嗎? 當然~不只~ 有點晚了,先睡覺去, 剩下的內容下次再來寫吧!