1烛卧、ShaderLab構(gòu)成
(1)ShaderLab Text:Shader編碼
(2)Shader Compiler
包含Preprocess和Binary Compile過程
(3)ShaderLab Asset
編譯后生成的文件
(4)ShaderLab Runtime
負(fù)責(zé)運(yùn)行時Shader解析工作
2、ShaderLab工作流
(1)如圖2-1灵再,Editor下Shader Compiler會對ShaderLab代碼進(jìn)行預(yù)處理生成Shader Compilation Info(中間信息集没佑,包含變體等信息)臀玄,然后Shader Compilation Info經(jīng)過序列化寫入Libarary/ShaderCache文件下笛洛。
PreProcess過程包含語法解析、詞法解析昆婿、提取不同語言的片段并使用對應(yīng)語言的編譯器解析球碉。
(2)Editor下運(yùn)行或打包時,Shader Compiler通過Binary Compile根據(jù)第一步生成的信息生成Shader Asset仓蛆。
其中Binary Compile為了平臺兼容性和實(shí)現(xiàn)簡便性會進(jìn)行兩步編譯睁冬,首先使用d3dcompiler將源Shader語言編譯成DXBC,然后使用改進(jìn)的HLSLCC將DXBC編譯成目標(biāo)平臺對應(yīng)的Shader看疙。Unity2020版本后為了提高擴(kuò)展性豆拨,將DXBC替換成DXIL
圖2-3是知乎上一大神總結(jié)的Unity中Shader編譯流程。
(3)真機(jī)Runtime加載Shader
如圖2-4能庆,當(dāng)需要某個shader時施禾,Unity的Persitent Manager會先創(chuàng)建一個Shader Class Instance的殼,然后調(diào)用Transfer Function將Shader Asset中存儲的shader數(shù)據(jù)反序列化填充Shader Class Instance搁胆,全部數(shù)據(jù)加載好后再從主線程喚醒進(jìn)行數(shù)據(jù)處理弥搞。
(4)WarmUp
如圖2-5,當(dāng)我們WarmUp一個Shader變體時渠旁,會對所有的Shader Variant進(jìn)行打分攀例,最后返回一個分?jǐn)?shù)最高的變體。
如圖2-6顾腊,Unity中Warmup一個變體時粤铭,CPU內(nèi)存中存儲的Code Data會被加載到GPU中處理,CPU中占用的內(nèi)存會被Unity清除杂靶。