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 ...