日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

unity shader 变种(多重编译 multi_compile)

發布時間:2023/12/13 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 unity shader 变种(多重编译 multi_compile) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、定義

在unity中我們可以通過使用#pragma multi_compile或#pragma shader_feature指令來為shader創建多個稍微有點區別的shader變體。這個Shader被稱為宏著色器(mega shader)或者超著色器(uber shader)。實現原理:根據不同的情況,使用不同的預處理器指令,來多次編譯Shader代碼。
在運行時,Unity從Material宏Material.EnableKeyword和Shader.DisableKeyword或全局著色器宏Shader.EnableKeyword和Shader.DisableKeyword中選擇適當的著色器變體。如果這兩個宏都未啟用,則Unity使用第一個宏。

二、使用

//定義兩個TEST_1,TEST_2兩個宏 #pragma multi_compile TEST_1 TEST_2 //在shader中使用 #ifdef TEST_1//Todo #endif #ifdef TEST_2//Todo #endif

上面這個命令會產生2種著色器變種:TEST_1,TEST_2。
要生成未定義預處理器宏的著色器變體,請添加一個僅為下劃線(__)的名稱。這是避免使用兩個宏的常用技術,因為對項目中可以使用的宏數量有限制,例如:

#pragma multi_compile __ TEST_1

在腳本中控制使用:

//使用TEST_1變種 Shader.EnableKeyword ("TEST_1"); Shader.DisableKeyword ("TEST_2");

三、組合

#pragma multi_compile TEST_1 TEST_2 #pragma multi_compile TEST_3 TEST_4 TEST_5

它產生總共六個著色器變體(TEST_1_TEST_3,TEST_1_TEST_4,TEST_1_TEST_5,TEST_2_TEST_3,TEST_2_TEST_4,TEST_2_TEST_5)。
所以如果有10行multi_compile,每行2個選項,那么將一共產生1024個著色器變體。
請記住,著色器變體數量將以這種方式瘋狂增長。

四、pragma shader_feature

shader_feature非常相似multi_compile。唯一的區別是Unity shader_feature在最終版本中不包含未使用的著色器變體。所以shader_feature適用于在我們在編輯器中,選中材質,設置它使用的shader的宏,如果在程序中動態的去設置可能無效(原因下面說明)。而對于multi_compile,會把所有的變體都編譯進程序里,所以適合需要在程序運行中動態改變狀態的宏,適合全局設置 。
材質中設置位置截圖:

五、宏限制

在unity中限制了全局的宏個數為265個,而unity內部使用了大約60個,所以在多個不同的著色器中定義全局宏時需要注意宏數量不要超過限制。
使用本地宏替代一部分全局宏:使用shader_feature_local和multi_compile_local。
shader_feature_local:類似于shader_feature,但枚舉宏是本地的。
multi_compile_local:類似于multi_compile,但枚舉宏是本地的。
在項目中除非是希望通過全局API啟用的那些特定宏,否則應盡量使用本地宏,
使用更多本地宏和更少的全局宏,以減少每個著色器的宏總計數。如果存在具有相同名稱的全局和本地宏,則Unity會優先使用local宏。
注意:
(1)不能將本地宏與進行全局宏更改的API一起使用(例如Shader.EnableKeyword或CommandBuffer.EnableShaderKeyword)。
(2)每個著色器最多有64個唯一的本地宏。
(3)如果Material啟用了本地宏,并且其著色器更改為不再聲明的宏,則Unity會創建一個新的全局宏。

六、內置multi_compile快捷方式

unity中提供一些內置的宏用于編譯多個著色器變體。這些主要用于處理Unity中不同的光照,陰影和光照貼圖類型。
multi_compile_fwdbase:編譯PassType.ForwardBase所需的所有變體。變體處理不同的光照貼圖類型,并啟用或禁用主方向光的陰影。
multi_compile_fwdadd:為PassType.ForwardAdd編譯變體。這將編譯變體以處理Directional,Spot或Point Light類型及其變體與Cookie紋理。
multi_compile_fwdadd_fullshadows:同樣multi_compile_fwdadd,但也包括燈具有實時陰影的能力。
multi_compile_fog:擴展為多個變體以處理不同的霧類型(off / linear / exp / exp2)。

大多數內置快捷方式都會產生許多著色器變體。如果您知道項目不需要它們,您可以使用#pragma skip_variants跳過編譯它們中的一些。例如:

#pragma multi_compile_fwdadd #pragma skip_variants POINT POINT_COOKIE

該指令跳過包含POINT或POINT_COOKIE的所有變體。

七、查看shader變種數量

#pragma multi_compile TEST_1 TEST_2 TEST_3 #pragma multi_compile TEST_4 TEST_5 #pragma multi_compile TEST_6 TEST_7

查看變體數量.png

?

上面的組合會產生3x2x2=12種變體,我們可以點擊show查看具體的變體組合名稱。

// Total snippets: 1 // ----------------------------------------- // Snippet #0 platforms ffffffff: Keywords always included into build: TEST_1 TEST_2 TEST_3 TEST_4 TEST_5 TEST_6 TEST_712 keyword variants used in scene:TEST_1 TEST_4 TEST_6 TEST_1 TEST_4 TEST_7 TEST_1 TEST_5 TEST_6 TEST_1 TEST_5 TEST_7 TEST_2 TEST_4 TEST_6 TEST_2 TEST_4 TEST_7 TEST_2 TEST_5 TEST_6 TEST_2 TEST_5 TEST_7 TEST_3 TEST_4 TEST_6 TEST_3 TEST_4 TEST_7 TEST_3 TEST_5 TEST_6 TEST_3 TEST_5 TEST_7

這里查看的是所有會被編譯的變體的數量,也就是#pragma multi_compile聲明的宏的全部組合。

#pragma multi_compile TEST_1 TEST_2 TEST_3 #pragma multi_compile TEST_4 TEST_5 #pragma shader_feature TEST_6 TEST_7

查看變種數量.png

// Total snippets: 1 // ----------------------------------------- // Snippet #0 platforms ffffffff: Keywords stripped away when not used: TEST_6 TEST_7 Keywords always included into build: TEST_1 TEST_2 TEST_3 TEST_4 TEST_56 keyword variants used in scene:TEST_1 TEST_4 TEST_6 TEST_1 TEST_5 TEST_6 TEST_2 TEST_4 TEST_6 TEST_2 TEST_5 TEST_6 TEST_3 TEST_4 TEST_6 TEST_3 TEST_5 TEST_6

上面的組合會產生3x2x1=6種變體,#pragma shader_feature沒有特別處理的話只有會默認包括第一個宏。

八、編譯

(1)material的ShaderKeywords

Material所包含的Shader Keywords表示啟用shader中對應的宏,Unity會調用當前宏組合所對應的變體來為Material進行渲染。在Editor下,可以通過將material的inspector調成Debug模式來查看當前material定義的Keywords,也可在此模式下直接定義Keywords,用空格分隔Keyword。

?

設置ShaderKeywords.png

?

優點:根據material中的ShaderKeywords自動生成變體。無需額外設置
缺點:多個不同的material包中可能存在相同的shader變體,造成資源冗余。若在程序運行時動態改變material的keyword其變體可能并沒有被生成
如上圖設置:如果ShaderKeywords中沒有設置TEST_6,這是如果我們想在程序中通過代碼動態使用TEST_6這個宏(Shader.EnableKeyword("TEST_6"))。可能不能得到想要的效果,因為TEST_6這個變種沒有生成。

(2)把Shader加入到Always Include Shaders列表里

找到ProjectSetting->Graphics->Always Include Shaders列表,將我們需要的shader添加到里面,這樣unity將會把這個shader的所有的變種都生成出來。

?

AlwaysIncludeShaders.png

優點:我們不用擔心項目發布出去以后有些變種沒有生成,不能在程序中動態的去控制我們的宏。
缺點:生成的變體數量龐大,導致發布時間變長,游戲包體過大。比如你把standardShader放進去,由于它有大量的keyword,全部變種都生成的話大概有幾百兆。

(3)使用ShaderVariantCollection是生成指定變體

ShaderVariantCollection是unity5.x以后用來記錄shader的哪些變體需要被生成。這樣做的好處就是在shader_feature與multi_compile結合使用時,能夠設置生成何種變體,從而避免生成不必要的變體;shader不必和material打在一個包中,避免了多個包中存在相同的變體資源;明確直觀的顯示了哪些變體是需要生成的。

生成方式:

(1)通過Create->Shader-> Shader Variant Collection,就可以新建一個shader variant collection文件,手動添加需要編譯的變種

?

ShaderVariantCollection.png

?

選擇需要生成的變種.png

?

(2)通過Edit->Project Settings->Graphics中的save to asst...按鈕,生成unity幫我們自動收集的,使用到的變種信息。

?

自動生成.png

這時候只需要先Clear一下,然后依次打開我們的所有場景,把需要的物體都顯示一遍,Unity就會自動記錄下來哪些著色器的哪些著色器變體已經被使用到。統計完后只需點擊下面的保存按鈕就可以生成我們所需要的ShaderVariantCollection資源。當然你也可以為你的每一個場景或者按需生成足夠多的ShaderVariantCollection資源。自動收集的功能不一定百分百可靠,最好事后多檢查。

ShaderVariantCollection加載:

啟動時預加載:

?

最簡單最粗暴的使用方式就是在游戲啟動的瞬間就直接加載ShaderVariantCollection資源并編譯里面的著色器變體,Unity已經為我們做好這一步了,依然還是在圖形設置面板里,只需把需要啟動是就編譯的ShaderVariantCollection添加在Preloaded Shaders里面

預加載.png


代碼加載:

由于ShaderVariantCollection也是一種資源,可以跟紋理、模型等等資源一起打包和加載等,只需在加載之后調用一句WarmUp。

ShaderVariantCollection shaderVariantCollection = Resources.Load <ShaderVariantCollection>( "MainShaderVariant"); if (shaderVariantCollection )shaderVariantCollection.WarmUp ();

也可以把ShaderVariantCollection放在Resources目錄下,好像會被自動加載。



?

總結

以上是生活随笔為你收集整理的unity shader 变种(多重编译 multi_compile)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 神马一区二区三区 | 欧美xxxxxhd| 我们的生活第五季在线观看免费 | 综合 欧美 亚洲日本 | 91精品国产91久久久久青草 | 裸体裸乳免费看 | 韩国三级av | 99有精品| 国产黄色一区 | 精彩视频一区二区三区 | 亚洲香蕉在线视频 | 91av高清| 春日野结衣av | 麻豆福利视频 | av乱码 | 久久r这里只有精品 | 三上悠亚 电影 | 午夜羞羞网站 | 欧美黄色免费大片 | 成av人片一区二区三区久久 | h片免费网站 | 国产日韩欧美电影 | 欧美人与性动交ccoo | 日韩av高清在线播放 | 国产激情在线视频 | 国产精品主播视频 | 日韩高清在线 | a中文在线 | 中文字幕亚洲精品在线 | 免费在线播放av | 国产成人无码精品久久久久久 | 制服.丝袜.亚洲.另类.中文 | 天堂在线中文字幕 | 日韩欧美精品在线观看 | 亚洲另类在线观看 | 欧美久久久久久久久久 | 久久狠狠高潮亚洲精品 | 日本精品久久久久久 | 无码少妇精品一区二区免费动态 | 少妇人妻偷人精品无码视频新浪 | 波多野结衣视频免费 | 夜色在线视频 | 日本中文字幕影院 | 精品一区二区无码 | 国产8区| 公车乳尖揉捏酥软呻吟 | 91精品免费观看 | 国产成人精品一区二区三区免费 | 成人亚洲精品 | 91免费视频大全 | 五月天激情综合 | 亚洲精选一区二区 | 一区二区三区中文字幕在线观看 | 亚洲大胆人体 | 三级全黄视频 | 91蜜桃臀久久一区二区 | 久久99久久99 | 欧美久久久久久久久中文字幕 | 欧美三级手机在线观看 | 免费在线黄 | 欧美一级做性受免费大片免费 | 白又丰满大屁股bbbbb | 免费在线看视频 | 免费黄色a级片 | 免费在线观看高清影视网站 | 人妻中文字幕一区 | 麻豆av在线看| 国产日韩中文 | 亚洲av熟女国产一区二区性色 | 欧美日韩a | 国产一级免费片 | 好吊日av| 少妇激情一区二区三区 | 久久成人a毛片免费观看网站 | 色噜噜色狠狠 | 精品免费av | 日本猛少妇色xxxxx猛叫 | 人人妻一区二区三区 | 尹人成人 | 精品人妻中文无码av在线 | 亚洲福利电影 | 色狠狠久久av大岛优香 | 国产日韩激情 | 国产日韩av一区二区 | 国产精品免费一区二区区 | 懂色av一区二区在线播放 | 久久99日韩 | 国产精品一区二区三 | 国产乱在线 | 亚洲精品国产精品国自产观看浪潮 | 婷婷久久伊人 | av色婷婷 | 综合第一页 | 天堂欧美城网站 | 精品人妻无码一区二区三区 | 无码日本精品xxxxxxxxx | 秋霞一区| av手机网站| 一卡二卡三卡在线视频 |