cocos creator 2.1版本Material材質(zhì)系統(tǒng)解析

ProgramLib(Shader庫)

管理與緩存shader源碼與編譯后的shader引用
_templates 關(guān)聯(lián)shader_nameshader源碼(vert, frag, defines)。顯而易見,shader_name要求全局唯一。
_cache緩存編譯后的shader引用。因為支持宏, 不同的宏配置,就對應了單獨的shader源碼,
不同的宏配置編譯出不一樣的program,所以_cachekey為元組(shader_name, defines)計算得到。

Pass(渲染)

Pass通過programName綁定shader,并記錄一些webgl的狀態(tài):

  • cullMode 剔除模式
  • blend 混合模式
  • depth 深度測試開關(guān)
  • stencil 模板測試配置

詳見 engine\cocos2d\core\renderer\render-engine.js:10322

Stage

是不是類比于UnityRendering Mode?
如果是的話,2d游戲,stage基本上都是設為transparent就可以了

Technique(技術(shù))

Technique管理1到多個pass. 多個pass的意義在于多通道渲染一組模型。 描邊或許算是一種應用場景?
Technique也提供了pass中用到的uniform變量的名稱、類型、大小和值的管理。
Technique設定Stages,可為渲染順序提供參考,通常設為transparent。stages為數(shù)組類型,passes也是數(shù)組類型,是否存在一一對應的關(guān)系?
_layer不知道作用

Effect(表現(xiàn))

關(guān)聯(lián)多個Technique
配置uniform屬性值

Effect.prototype.setProperty(name, value)
Effect.prototype.getProperty(name)

配置shader

Effect.prototype.getDefine(name)
Effect.prototype.define(name, value)

注意 defines要求在構(gòu)造函數(shù)中給出,后續(xù)define的值可以變,但屬性沒辦法直接調(diào)用define函數(shù)動態(tài)增減

Material(材質(zhì))

關(guān)聯(lián)一個Effect
管理 _texIds:

_texIds: ids collected from texture defines

維護一個更新哈希值_hash。材質(zhì)數(shù)據(jù)有變化時,需要調(diào)用updateHash更新哈希。

作用

上述可知,Material,Effect,Technique,Pass都只是數(shù)據(jù)容器而已,具體如何使用,就是渲染函數(shù)的責任了。

網(wǎng)上的資料講,OGRE的材質(zhì)系統(tǒng)分成三層抽象:Material,Technique, Pass. Unity的材質(zhì)系統(tǒng)也是三層:Shader,SubShader,Pass。多Pass實現(xiàn)同一模型,調(diào)用多次渲染。多Technique方便作低中高質(zhì)量切換,Material存放配置數(shù)據(jù)。
cocos creator的材質(zhì)系統(tǒng)多出個Effect,現(xiàn)在還是比較不理解。

渲染流程

渲染相關(guān)類:

class Base;
class ForwardRenderer extends Base;

render-engine.js中定義了唯一一個stage:transparent.并在ForwardRenderer中注冊了transparentstage的渲染函數(shù)_transparentStage。

渲染入口函數(shù)為ForwardRenderer.prototype.render,遍歷所有相機,為每個相機調(diào)用一次ForwardRenderer.prototype.renderCamera(camera, scene)。然后跳入Base._render,清除設備,從scene._modelsextractDrawItem,遍歷每個drawItem,從effect.getTechnique(stage)中得到tech。最后調(diào)用_transparentStage。
_transparentStage設定下矩陣,又回到Base._draw函數(shù)中,執(zhí)行真正的渲染。
Base._draw根據(jù)Effect,Technique,Pass的數(shù)據(jù),得到shader,并為shader設置好webgl狀態(tài)和各個Uniform變量,最后調(diào)用device.draw完成一個渲染流程。

根據(jù)渲染流程,可推測,cocos creator的材質(zhì)系統(tǒng)也是三層:Effect,Technique,Pass。Material繼承Asset,對Effect作進一步封閉, 是為了方便編輯器?

詳見 engine\cocos2d\core\renderer\render-engine.js:13303engine\cocos2d\core\renderer\render-engine.js:13677

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容