Unity ShaderLab學習總結

2021-09-19 18:28:31 字數 2272 閱讀 9768

本文只討論unity shaderlab相關的知識和使用方法。但,

既不討論渲染相關的基礎概念,基礎概念可參考rendering pipeline overview等文章。

也不討論具體的渲染技巧

移動裝置gpu和桌面裝置gpu硬體架構上有較多不同點,詳見下面的「移動裝置gpu架構簡述」一章。

一句話總結:

gameobject裡有meshrenderer,

meshrenderer裡有material列表,

每個material裡有且只有乙個shader;

material在編輯器暴露該shader的可調屬性。

所以關鍵是怎麼編寫shader。

shader基礎

編輯器使用monodevelop這***的ide來編寫shader居然是讓人滿意的。有語法高亮,無語法提示。

如果習慣visualstudio,可以如下實現.shader檔案的語法高亮。

subshader

shader "shaderlab tutorials/testshader"

}乙個shader有多個subshader。乙個subshader可理解為乙個shader的乙個渲染方案。即subshader是為了針對不同的渲染情況而編寫的。每個shader至少1個subshader、理論可以無限多個,但往往兩三個就足夠。

乙個時刻只會選取乙個subshader進行渲染,具體subshader的選取規則包括:

從上到下選取

subshader的標籤、pass的標籤

是否符合當前的「unity渲染路徑」

是否符合當前的replacementtag

subshader是否和當前的gpu相容

等按此規則第乙個被選取的subshader將會用於渲染,未被選取的subshader在這次渲染將被忽略。

subshader的tag

shader "shaderlab tutorials/testshader"

//...}}

subshader內部可以有標籤(tags)的定義。tag指定了這個subshader的渲染順序(時機),以及其他的一些設定。

"rendertype"標籤。unity可以執行時替換符合特定rendertype的所有shader。camera.renderwithshader或camera.setreplacementshader配合使用。unity內建的rendertype包括:

"opaque":絕大部分不透明的物體都使用這個;

"transparent":絕大部分透明的物體、包括粒子特效都使用這個;

"background":天空盒都使用這個;

"overlay":gui、鏡頭光暈都使用這個;

使用者也可以定義任意自己的rendertype這個標籤所取的值。

應注意,camera.renderwithshader或camera.setreplacementshader不要求標籤只能是rendertype,rendertype只是unity內部用於replace的乙個標籤而已,你也可以自定義自己全新的標籤用於replace。

比如,你為自己的shadera.subshadera1(會被unity選取到的subshader,常為shader檔案中的第乙個subshader)增加tag為"distort"="on",然後將"distort"作為引數replacementtag傳給函式。此時,作為replacementshader實參的shaderb.subshaderb1中若有也有一模一樣的"distort"="on"、且這a的材質引數包含b所需材質引數,則此subshaderb1將代替subshadera1用於本次渲染。

具體可參考rendering with replaced shaders

"queue"標籤。定義渲染順序。預製的值為

"background"。值為1000。比如用於天空盒。

"geometry"。值為2000。大部分物體在這個佇列。不透明的物體也在這裡。這個佇列內部的物體的渲染順序會有進一步的優化(應該是從近到遠,early-z test可以剔除不需經過fs處理的片元)。其他佇列的物體都是按空間位置的從遠到近進行渲染。

"alphatest"。值為2450。已進行alphatest的物體在這個佇列。

"transparent"。值為3000。透明物體。

"overlay"。值為4000。比如鏡頭光暈。

使用者可以定義任意值,比如"queue"="geometry+10"

"forcenoshadowcasting",值為"true"時,表示不接受陰影。

"ignoreprojector",值為"true"時,表示不接受projector元件的投影。

學做事,先學做人

經理很關照我,我很感謝經理。其實,有乙個好的領導,只要好好幹,他是一定會知道的。但是,要改變客戶的看法,看來還真的很難。在客戶面前不可以太謙虛,太過謙虛,他們反覺得我們無能。做事先做人,一點都沒錯啊。感覺自己太嫩了,這一切還得慢慢磨練。希望多看數,多學習,多仔細觀察生活,觀察周圍成功的人,不斷提高自...

B 學密碼學真的得學程式

b 學密碼學真的得學程式 time limit 1000msmemory limit 65536kb64bit io format lld llu submit status practice sdutoj 2464 description 話說,上次zyj同學最終在眾位瑪麗亞的幫助下搞定了那個神奇...

學密碼學一定得學程式

time limit 1000ms memory limit 65536k 曾經,zyj同學非常喜歡密碼學。有一天,他發現了乙個很長很長的字串s1。他很好奇那代表著什麼,於是神奇的wl給了他另乙個字串s2。但是很不幸的是,wl忘記跟他說是什麼意思了。這個時候,zyj不得不求助與偉大的zp。zp笑了笑...