Shader山下(二十一)多重变体(Multiple Variants)
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
Shader山下(二十)編譯指令(Compilation Directives)介紹了如何使用編譯指令,本文就專(zhuān)文介紹一下多重編譯(multi_compile)指令。
我們可以使用multi_compile來(lái)為shader創(chuàng)建多個(gè)稍微有點(diǎn)區(qū)別的shader變體。這個(gè)Shader被稱(chēng)為宏著色器(mega shader)或者超著色器(uber shader)。實(shí)現(xiàn)原理:根據(jù)不同的情況,使用不同的預(yù)處理器指令,來(lái)多次編譯Shader代碼。
在Unity里面,可以使用:
#pragma multi_compile#pragma shader_feature兩個(gè)指令來(lái)實(shí)現(xiàn)。適用于VF著色器和表面著色器。
運(yùn)行時(shí),會(huì)根據(jù)材質(zhì)(Material)的關(guān)鍵字(Material的對(duì)象方法EnableKeyword和DisableKeyword)或者全局著色器關(guān)鍵字(Shader的類(lèi)方法EnableKeyword和DisableKeyword)。
注:之前在Shader山下(十二)材質(zhì)屬性繪制器里,我們已經(jīng)介紹了多重編譯的運(yùn)用
?
使用multi_compile指令:
#pragma multi_compile TEST_OFF TEST_ON
這樣會(huì)編譯兩個(gè)Shader變體,一個(gè)是TEST_OFF的版本,一個(gè)是TEST_ON的版本。運(yùn)行的時(shí)候會(huì)根據(jù)材質(zhì)關(guān)鍵之或者Shader全局關(guān)鍵字判斷應(yīng)該使用哪個(gè),如果兩個(gè)關(guān)鍵字都為false,那么會(huì)使用第一個(gè)(TEST_OFF)變體。
我們也可以創(chuàng)建多個(gè)關(guān)鍵字:
#pragma multi_compile TEST_A TEST_B TEST_C TEST_D
或者只創(chuàng)建一個(gè)關(guān)鍵字,這時(shí)候就需要使用__來(lái)代替另一個(gè):
這樣依然會(huì)生成兩個(gè)shader變體,一個(gè)啥都沒(méi)定義,另外一個(gè)定義了TEST_KEY_ON。
我們還可以通過(guò)多行指令來(lái)組合關(guān)鍵字:???????
這樣就會(huì)生成六個(gè)shader變體(A+D、B+D、C+D、A+E、B+E、C+E)。但是這樣shader變體的數(shù)量就可能會(huì)變得很多,10行multi_compile,每行有兩個(gè)關(guān)鍵字,那么就會(huì)有1024個(gè)shader變體。
除了multi_compile之外,還有另外一個(gè)類(lèi)似的指令shader_feature,唯一的區(qū)別在于shader_feature不會(huì)將不用的shader變體添加到程序中去。shader_feature更適用于材質(zhì)的關(guān)鍵字,而multi_compile更適用于代碼設(shè)置的全局關(guān)鍵字。
示例:
#pragma shader_feature TEST_STUFF
這是下面這種寫(xiě)法的簡(jiǎn)寫(xiě)形式:
注:Unity中最多可以有128個(gè)關(guān)鍵字,但是Unity自己已經(jīng)定義了一部分了,所以實(shí)際上會(huì)更少。所以使用multi_compile和shader_feature的時(shí)候,就需要特別注意不要超過(guò)這個(gè)限制。
?
Unity自身還內(nèi)建一些multi_compile的快捷寫(xiě)法:
multi_compile_fwdbase:為基本前向渲染通道編譯多個(gè)變體,不同的變體可能需要處理不同的光照貼圖類(lèi)型,或者一些使用了主平行光的陰影,而另一些禁用了。(參考Unity渲染管線)
multi_compile_fwdadd:為附加前向渲染通道編譯多個(gè)變體,不同的變體可能需要處理不同類(lèi)型的光源——平行光、聚光燈或者點(diǎn)光源,亦或者它們附帶cookie紋理的版本。
multi_compile_fwdadd_fullshadows:同上,不過(guò)包含了可以讓光源擁有實(shí)時(shí)陰影的功能。
multi_complie_fog:為處理不同的霧效類(lèi)型(off/linear/exp/exp2)擴(kuò)展了多個(gè)變體。
?
大部分內(nèi)建快捷寫(xiě)法會(huì)導(dǎo)致許多shader變體,如果某些不需要使用,那么可以使用#pragma skip_variants來(lái)忽略它們。
#pragma multi_compile_fwdadd// will make all variants containing// "POINT" or "POINT_COOKIE" be skipped#pragma skip_variants POINT POINT_COOKIE?
使用multi_compile的目的一般是為了創(chuàng)建一些fallback或者簡(jiǎn)化shader,它們?cè)谕粋€(gè)目標(biāo)平臺(tái)(例如OpenGL ES)的高端硬件和低端硬件上都可以高效地運(yùn)行。這種時(shí)候,我們可以使用shader硬件變體來(lái)為不同性能等級(jí)的硬件創(chuàng)建一個(gè)特殊優(yōu)化的變體集合。
為了生成shader硬件變體,需要添加#pragma hardware_tier_variantsrenderer,這里renderer表示某個(gè)可運(yùn)行的渲染平臺(tái)。使用這個(gè)指令,Unity會(huì)對(duì)每個(gè)shader生成3個(gè)shader變體(其他關(guān)鍵字會(huì)不起作用),而對(duì)應(yīng)的關(guān)鍵字是:
UNITY_HARDWARE_TIER1
UNITY_HARDWARE_TIER2
UNITY_HARDWARE_TIER3
在編輯器里,可以通過(guò)Graphics Emulation菜單來(lái)測(cè)試他們。
注:這些shader并不受Quality Setting的影響,它們純粹是通過(guò)檢測(cè)GPU的相關(guān)性能來(lái)決定的。
轉(zhuǎn)載于:https://my.oschina.net/u/918889/blog/1858676
總結(jié)
以上是生活随笔為你收集整理的Shader山下(二十一)多重变体(Multiple Variants)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mount.nfs: Remote I/
- 下一篇: ajax方式下载文件