設計目的:頂點-幾何-片元著色器處理方式比較適合gpu去理解,但是對人理解而言就顯得比較晦澀。所以unity提供了一種適合人類理解的處理方式,也就是表面著色器-光照模型-光照著色器。它是在頂點-幾何-片元著色器上面進行的一層抽象封裝,最終還是會被unity翻譯成頂點-幾何-片元著色器的處理方式。
表面著色器:通常用來定義渲染相關的變數。
光照模型:就是選擇蘭伯特或者phong等光照模型。
光照著色器:就是用來處理光照衰減和陰影等。
兩個結構體:就是用來對表面著色器-光照模型-光照著色器進行資料傳遞的結構體。具體用法如下:
1.input結構體:主要用來記錄表面函式所需要的一些輸入引數,是可以自定義擴充套件的。常見的引數如下:
2.su***ceoutput/su***ceoutputstandard/su***ceoutputstandardspecular結構體:用來儲存表面函式輸入引數,並作為輸出引數提供給光照函式進行光照處理。其中相關結構體固定不可以擴充套件。而且選擇蘭伯特或者phong等普通的光照模型時,我們應該使用su***ceoutput結構體來對應普通的光照函式。選擇基於物理的standard光照模型時,我們應該使用su***ceoutputstandard結構體來對應金屬流程的光照函式。使用基於物理的standardspecular光照模型時,我們應該使用su***ceoutputstandardspecular結構體來對應高光的光照函式。
編譯指令:是我們與unity進行互動的一種方式。對應的格式為:
#pragma su***ce 表面函式 lightmode [可選引數]
1.表面函式:格式為void surf(input in, inout su***ceoutput/su***ceoutputstandard/su***ceoutputstandardspecular o),其中input用來設定各種表面屬性,交由su***ceoutput/su***ceoutputstandard/su***ceoutputstandardspecular 輸出給光照函式進行光照處理。其中su***ceoutput/su***ceoutputstandard/su***ceoutputstandardspecular 根據選擇的光照模型進行確定到底使用哪乙個。
2.光照函式:格式為hlaf4 lighting光照函式名(su***ceoutput/su***ceoutputstandard/su***ceoutputstandardspecular s, half3 lightdir, half3 viewdir(可選),half atten)。使用表面著色器函式中輸出的表面屬性,應用指定的光照模型來模擬物體表面的光照效果。
3.可選引數:對表面著色器的行為進行擴充套件,常見的可選引數如下:
自定義修改函式:可以設定頂點修改函式,來修改某些頂點。也可以設定顏色修改函式,來修改某些顏色。
控制**生成:使用execude_path來控制表面著色器只能在某些渲染路徑中自動生成的**。
透明度測試和混合:使用alpha進行透明度混合,alphatest進行透明度測試。
表面著色器在unity背後執行原理:因為表面-光照模型-光照著色器處理方式是在頂點-幾何-片元著色器上層的抽象封裝,所以最終unity都會將其解析成多個pass,每個pass的執行過程大致如下所示:
1.生成頂點著色器處理函式並將頂點資料傳遞給該處理函式。在處理函式內部先用頂點修改函式,對頂點資料進行處理,然後填充v2f_surf結構體輸出。
2.生成片元著色器來接收v2f_surf結構體資料,並填充到input結構體中,然後將該結構體傳遞給表面函式進行處理,得到su***ceoutput/su***ceoutputstandard/su***ceoutputstandardspecular結構體,並將其傳遞給光照函式使用指定的光照模型來進行光照計算,將得到的片元顏色輸入給最後的片元修改函式進行最後的處理,得到最終的畫素顏色。
3.對應的處理流程圖大致如下所示:
4.檢視生成的頂點-幾何-片元著色器**,可以通過以下操作檢視。
表面著色器的優缺點:
1.優點:表面著色器是在頂點-幾何-片元著色器上層的抽象封裝,所以我們不用寫複雜的**,直接定義好相關的引數和編譯指令就可以實現我們需要的效果。
2.缺點:表面著色器必須按照它的規則去寫**,自由度不高,而且內部生成的頂點-幾何-片元著色器也不是最優的,往往會產生效能上面的問題。
表面著色器
除了幾乎從頭開始編寫著色器之外,unity還允許我們定義一些引數,並讓unity生成執行複雜光照計算的 這些著色器稱為 表面著色器 之前的basic shader轉換到表面著色器 使用表面著色器時,我們不必做其他的事情,因為unity會為我們生成它們。為了轉換為你表面著色器,可以完全刪除頂點著色器。...
表面著色器一
在su ce shader當中不需要編寫pass通道,su ce shader就是對vertex shader和fragment shader的一種包裝。它主要可以用來生成 所以生成的過程不需要進行干預,因此pass通道也能夠幫我們自動生成,不需要去新增pass通道。一 建立的shader的 sha...
表面著色器二
一 surf函式 void surf input in,inout su ceoutputstandard o 二 該函式是無返回值的,第乙個引數input in就是我們定義的乙個結構體 struct input 在這個函式中,只是使用了乙個主紋理的紋理座標,這個紋理座標必須要以uv小寫開頭 三 第...