管理與緩存 shader 源碼與編譯後的 shader 引用
_templates 關聯 shader_name 與 shader 源碼 (vert, frag, defines) 。顯而易見, shader_name 要求全局唯壹。
_cache 緩存編譯後的 shader 引用。因為支持宏, 不同的宏配置,就對應了單獨的 shader 源碼,
不同的宏配置編譯出不壹樣的 program ,所以 _cache 的 key 為元組 (shader_name, defines) 計算得到。
Pass 通過 programName 綁定 shader ,並記錄壹些 webgl 的狀態:
詳見 engine\cocos2d\core\renderer\render-engine.js:10322
是不是類比於 Unity 的 Rendering Mode ?
如果是的話, 2d 遊戲, stage 基本上都是設為 transparent 就可以了
Technique 管理1到多個 pass . 多個 pass 的意義在於多通道渲染壹組模型。 描邊或許算是壹種應用場景?
Technique 也提供了 pass 中用到的 uniform 變量的名稱、類型、大小和值的管理。
為 Technique 設定 Stages ,可為渲染順序提供參考,通常設為 transparent 。 stages 為數組類型, passes 也是數組類型,是否存在壹壹對應的關系?
_layer 不知道作用
關聯多個 Technique
配置 uniform 屬性值
配置 shader 宏
註意 defines 要求在構造函數中給出,後續 define 的值可以變,但屬性沒辦法直接調用 define 函數動態增減
關聯 壹個 Effect
管理 _texIds :
維護壹個更新哈希值 _hash 。材質數據有變化時,需要調用 updateHash 更新哈希。
上述可知, Material , Effect , Technique , Pass 都只是數據容器而已,具體如何使用,就是渲染函數的責任了。
網上的資料講, OGRE 的材質系統分成三層抽象: Material , Technique , Pass . Unity 的材質系統也是三層: Shader , SubShader , Pass 。多 Pass 實現同壹模型,調用多次渲染。多 Technique 方便作低中高質量切換, Material 存放配置數據。
cocos creator 的材質系統多出個 Effect ,現在還是比較不理解。
渲染相關類:
render-engine.js 中定義了唯壹壹個 stage : transparent .並在 ForwardRenderer 中註冊了 transparent stage的渲染函數 _transparentStage 。
渲染入口函數為 ForwardRenderer.prototype.render ,遍歷所有相機,為每個相機調用壹次 ForwardRenderer.prototype.renderCamera(camera, scene) 。然後跳入 Base._render ,清除設備,從 scene._models 中 extractDrawItem ,遍歷每個 drawItem ,從 effect.getTechnique(stage) 中得到 tech 。最後調用 _transparentStage 。
_transparentStage 設定下矩陣,又回到 Base._draw 函數中,執行真正的渲染。
Base._draw 根據 Effect , Technique , Pass 的數據,得到 shader ,並為 shader 設置好 webgl 狀態和各個 Uniform 變量,最後調用 device.draw 完成壹個渲染流程。
根據渲染流程,可推測, cocos creator 的材質系統也是三層: Effect , Technique , Pass 。 Material 繼承 Asset ,對 Effect 作進壹步封閉, 是為了方便編輯器?
詳見 engine\cocos2d\core\renderer\render-engine.js:13303 和 engine\cocos2d\core\renderer\render-engine.js:13677