全文共5000+字,分為8個(gè)章節(jié),由本人歷時(shí)一周整理而來(lái)。由于篇幅問題,將本文分為8個(gè)章節(jié)分開發(fā)布。全文 (不) 詳細(xì)描述了cocoscreator 引擎的2.40版本中,web平臺(tái)的js部分引擎的渲染流程。請(qǐng)將文章配合源碼一起食用!
?由于我尚在學(xué)習(xí)引擎源碼中,文章可能有不正確的部分,所以我會(huì)不斷更新內(nèi)容。如有錯(cuò)誤或補(bǔ)充,請(qǐng)留言交流!
全部章節(jié)鏈接:
六 材質(zhì)系統(tǒng)
官方對(duì)材質(zhì)系統(tǒng)的介紹較為詳細(xì),所以本文不詳細(xì)介紹,只做大概概括。為了解詳細(xì)內(nèi)容可見文末的官方文檔 相關(guān)鏈接:材質(zhì)系統(tǒng)。
材質(zhì)系統(tǒng)控制著每個(gè)模型最終的著色流程與順序, 在引擎內(nèi)相關(guān)類間結(jié)構(gòu)如下:
6.1 EffectAsset
在編輯器導(dǎo)入 EffectAsset 時(shí), 會(huì)對(duì)用戶書寫的內(nèi)容做一次預(yù)處理, 替換 GL 字符串為管線內(nèi)常量, 提取 shader 信息, 轉(zhuǎn)換 shader 版本等.
CCEffectAsset 組件的 onLoad 中,會(huì)將shader信息注冊(cè)到 cc.renderer._forward._programLib (類型: ProgramLib )中,代碼如下。
let lib = cc.renderer._forward._programLib;
for (let i = 0; i < this.shaders.length; i++) {
lib.define(this.shaders[i]);
}
6.2 Material
Material 資源可以看成是 EffectAsset 在場(chǎng)景中的資源實(shí)例, 它本身的可配置參數(shù)有:
- effectAsset 或 effectName: effect 資源引用, 使用哪個(gè) EffectAsset 所描述的流程進(jìn)行渲染? (必備)
- technique: 使用 EffectAsset 中的第幾個(gè) technique? (默認(rèn)為 0 號(hào))
- defines: 宏定義列表, 需要開啟哪些宏定義? (默認(rèn)全部關(guān)閉)
- states: 管線狀態(tài)重載列表, 對(duì)渲染管線狀態(tài) (深度模板透明混合等) 有哪些重載? (默認(rèn)與 effect 聲明一致)
6.3 Effect 語(yǔ)法
具體詳細(xì)內(nèi)容可見文末相關(guān)鏈接:材質(zhì)系統(tǒng) 下的詳細(xì)內(nèi)容。
相關(guān)鏈接
RenderFlow的性能優(yōu)化:http://docs.cocos.com/creator/manual/zh/advanced-topics/render-flow.html#
自定義渲染合批之自定義頂點(diǎn)格式: https://forum.cocos.org/t/demo/95087
自定義RenderFlow,處理背包等場(chǎng)景下drawcall過(guò)多:https://forum.cocos.org/t/ui/80026
材質(zhì)系統(tǒng):https://docs.cocos.com/creator3d/manual/zh/material-system/overview.html