一起來看,社區大佬揭開 Creator 2.1.2 材質系統的神秘面紗!

  • 2019 年 10 月 4 日
  • 筆記

本文已向 Cocos論壇社區大佬「lxb229」獲得授權,感謝他的精彩分享!

粗解 Cocos Creator 2.1.2 Shader

最近空閑的時候,研究了一下 2.1.2 版本的 shader,這裡單獨提出來一個說明一下,希望對想了解 2.1.2 的童鞋有所幫助。

首先,新建一個Effect,從上往下說吧。

現在 2.1.2 的 Creator把 effect 做成了和 Component 類似的組件,在 properties 中,這裡可以設置外部屬性,在編譯器中暴露出來。

在當前版本中,可以在properties中設置的類型有:float、vec2、vec3、color4。

第二,在頂點著色器 vs 中,屬性名稱有所變化,請看下圖:

這裡特別注意的是 uniform mat4 cc_matViewProj

第三,在片元著色器 fs 中,基本和 2.0.x 的沒有什麼變化,只需要把外部屬性對應在 properties 中即可,看下圖所示:

注意,在 properties 中類型為 color4 的,這裡是vec4。

最後,就是調用的問題,現在因為 shader 還不穩定,所以官方也沒有把 API 完善,有點問題。我只寫了一個需要刷新 time 的外部屬性的例子,你也可以照著寫,像下面一樣:

//ShaderTime.ts    const {ccclass, property} = cc._decorator;    @ccclass  export default class ShaderTime extends cc.Component {      _material: any;      @property      max = 65535;        start() {          this._material = this.node.getComponent(cc.Sprite).sharedMaterials[0];      }      private _start = 0;        protected update(dt) {          if (this.node.active && this._material) {              this._setShaderTime(dt);          }      }      private _setShaderTime(dt) {          let start = this._start;          if (start > this.max) start = 0;          start += 0.01;          this._material.effect.setProperty('time', start);          this._start = start;      }  }

哦,對了 Effect 設置好了,直接拖拽就可以用了,看下實際運行效果:

注意:因為切圓的 shader 在瀏覽器上的圖片頂點取值好像有問題(實測:在 8 * 8 以下 和 513*513 以上的圖片尺寸,在 Web 上沒問題),所以我重新放了一個外發光的 shader,供大家參考。

在Web顯示有問題的解決方案 :

// 關掉引擎的動態圖集(慎用,這會導致遊戲的其他drawcall 增高)  cc.dynamicAtlasManager.enabled = false;

本文工程下載地址:https://forum.cocos.com/uploads/default/original/3X/f/a/fa9f5a9ac9aa8a8db3d1781cb6d79b046e0a6252.zip

論壇原文地址:

https://forum.cocos.com/t/creator-2-1-2-shader/82058

結語

感謝 Cocos 論壇社區中的「lxb229」分享的精彩文章,讓我們受益非淺,相信你還能從中獲得更多的啟發。