Shader理論《四》概述以及結構

2021-08-17 20:10:57 字數 3123 閱讀 7878

1.在unity中我們需要配合使用材質(material)和unity shader才能達到需要的效果。材質是載體,unity shader是文字檔案,我們在unity shader中寫好渲染的**(屬性,頂點著色器,片元著色器等),載入到材質上,在材質上可以調節shader的屬性,然後將材質賦給模型展示渲染效果。

2.unity shader不是傳統意義上的的shader,unity shader實際上指的是乙個shaderlab檔案--以.shader為檔案字尾的一種檔案。但unity shader可以做的遠多於乙個傳統意義的shader。

a、傳統shader中,我們只可以編寫特定型別的shader,比如頂點著色器,或片元著色器等。unity shader中我們可以在乙個檔案中編寫他們。

b、傳統shader中,我們不能做一些例如開啟混合、深度測試等渲染測試,這是在另外的**中設定的。unity shader中我們加幾個指令就可以了。

c、傳統shader中,需要編寫大量**設定著色器的輸入和輸出。unity shader中,我們只需要宣告一些屬性,並可以在材質中改變這些屬性。對於模型資料(頂點位置,紋理座標,法線,切線等),unity shader中我們可以直接訪問,傳統shader需要自行編碼傳給shader。

d、unity shader的高度封裝,使其失去了更多的編寫自由性,不過同時也使我們只需要和unity shader打交道,不用關心渲染引擎底層實現。

3.unity 5.5版本中,提供了5種unity shader模板:standard su***ce shader,standard su***ce shader(instanced),unlit shader,image effect shader, compute shader。

a、standard su***ce shader是基於物理渲染(pbs)的包含標準光照模型的表面著色器模板,在5.x版本中,我們新建乙個材質,它會預設使用內建的standard shader,是使用基於物理渲染(pbs)的技術,區別於傳統光照shader,它對光照渲染有著更加強大的支援,當然如果想達到強大的效果,除了主紋理和法線紋理,你可能需要加入金屬紋理,粗糙度紋理,遮擋紋理,細節紋理,並配置一堆屬性,再加上光照探針,反射探針啥的,想清楚再用。

b、standard su***ce shader(instanced),據說是5.4版本以後加的,使用了gpu instancing技術,這個技術在大量使用相同材質和網格的情況下可以大幅度降低draw call,而這個模板在生成陰影pass中使用了該技術。

c、unlit shader:不包含光照但包含霧效的頂點片元著色器。

f、compute shader:產生特殊的shader檔案,旨在利用gpu的並行性來進行一些與常規渲染流水線無關的計算。(原書照搬,不在研究範圍)。

a和b是表面著色器,c和d是頂點片元著色器,請對應選擇模板。(因為喜歡用頂點片元著色器,我喜歡用d)

上面提到過unity shader不是傳統意義的shader,編寫傳統意義的shader需要和很多檔案和配置打交道,unity為我們提供了一層抽象:unity shader,而專門為unity shader服務的語言就是shaderlab。

三.unity shader結構

1.名字

每個unity shader第一行都需要定義乙個名字,格式例子:shader "custom/myshader","/"是路徑,其對應位置為shader->custom->myshader。

2.屬性(properties)

properties   

//其他pass  

...  

}  

a、tags:標籤,由一組鍵值對組成,鍵和值都是字串,它們告訴unity渲染引擎,我希望怎樣及何時渲染該subshader。結構如下:

tags

新手注意,每個標籤間隔不要加逗號或分號,只是空格,最後也沒符號,新手這裡容易寫錯。

subshader支援的標籤型別如下(書上截圖,原諒我懶):

注意,這裡的標籤是在subshader裡的,不是pass裡的,它們不同。

b、rendersetup

狀態設定,shaderlab提供了一系列渲染狀態的設定指令,可以設定在subshader裡,影響其下所有pass,也可以放某個pass裡,只影響該pass。常見的渲染設定如下(接著截圖):

subshader中可以有多個pass,每個pass定義了一次完整的渲染流程,但pass過多會造成渲染效能下降,所以我們盡量用最少數目的pass。

pass包含的語義如下:

[html]view plain

copy

pass   

name:該pass名字,可選,書寫例子如下:

name "mypassname"

通過該名字,我們可以在其他的unity shader中用usepass命令直接使用該pass,非常方便,例如

usepass "myshader/mypassname"

需要注意的是unity內部會把所有pass名稱轉換成大寫字母,所以用usepass時必須使用大寫形式的名字。

上面subshader的rendersetup(狀態設定)同樣適用於pass。

pass的標籤不同於subshader的標籤,下面是pass中使用的標籤:

還有一些特殊的pass

usepass:前面提到了,可以用pass的名字復用訪問。

grabpass:該pass負責抓取螢幕並存到一張紋理中,後面的pass可以對該紋理繼續處理。

d、fallback

放在最後,當所有subshader都不合適,就用fallback提供的shader。語義如下:

fallback "name" 或 fallback off

不要以為它沒用,當你學到陰影那裡就知道它的用處了,fallback的內建shader往往包含乙個通用的陰影投射pass,所以你不用自己實現。

Loading效果之四Shader

思路 1 提高畫方型函式,並支援可自轉功能 2 以fixed2 0.5,0.5 為圓點,在圓點 正右 右上 正上 左上 正左 左下 正下 右下9個方位畫上方型 3 圓點方型做縮放動畫,其餘方型做自轉以及直線來回運動,如下 shader hidden loading subshader struct ...

演算法概述及複雜理論

1 可計算問題 不可計算問題 計算機研究可計算問題 2 困難問題 時間度量 3 p np npc 解決問題的乙個方法或過程,是乙個由若干個演算法指令組成的有窮序列。演算法的特點 1 輸入和輸出 2 確定性 3 可行性 4 有窮性 演算法的描述 1 偽 2 流程圖 3 自然語言的描述 對任意乙個輸入,...

Shader理論《五》漫反射光照模型

漫反射的光照模型計算公式 由上公式可知計算漫反射我們要知道四個引數 入射光線的顏色跟強度c light,材質的漫反射係數m diffuse,表面法線方向l。shader a幻世界 diffusevertex subshader cgprogram pragma vertex vert pragma ...