學習3D開發(fā)技術的時候無可避免的要接觸到Shader,那么Shader是個什么概念呢?其實對于開發(fā)同事來說還是比較難理解的,一般來說Shader是服務于圖形渲染的一類技術,開發(fā)人員可以通過其shader語言來自定義顯卡渲染頁面的算法,從而達到按照自己的想法來渲染出目標效果。
1. Unity Shader
不同的圖形API會對應不同的Shader語言,感興趣的可以去了解下更多這方面的內容。Unity目前開發(fā)階段基于Windows平臺開發(fā)和運行,一般采用Direct3D或OpenGL,如需要兼容其他平臺可在打包的時候選取對應平臺如安卓、IOS等,并關注切換后是否存在”粉色“的情況,如出現(xiàn)模型表面為”粉色“,一般是Shader出現(xiàn)不兼容錯誤,需要修復。
在編碼之前我們需要先來了解下Unity常見的幾種Shader:
1. Surface Shaders 表面著色器
????????Unity對Vertex/Fragment Shader的又一層包裝,以使Shader的制作方式更符合人類的思維模式,同時可以以極少的代碼來完成不同的光照模型與不同平臺下需要考慮的事情。
2.?Vertex/Fragment Shaders 頂點/片段著色器(重要)
????????一般的頂點+片段著色器的工作原理如下圖所示
a. 頂點處理(頂點著色器)
????????主要執(zhí)行坐標轉換和逐頂點光照的任務,坐標轉換是將頂點坐標從模型空間轉換到齊次裁剪空間中,可以使用UnityObjectToClipPos()函數(shù)來實現(xiàn)。
b. 圖元處理
????????在裁剪空間中進行裁剪(Clipping)、背面剔除(Back-Face Culling)、屏幕映射(ScreenMapping)等操作。為的是剔除不需要的頂點/面,并做好三維坐標到二維屏幕坐標的轉換。
c. 光柵化
????????是將變換到屏幕空間的圖元離散化為片元的過程。
d. 片段處理(片段著色器)
????????(1). 紋理貼圖 - Textures
????????紋理貼圖也稱為紋理映射,是將圖像信息映射到三角形網(wǎng)格上的技術,以此來增加物體表面的細節(jié),令物體更具有真實感。
????????(2). 光照計算 - Lighting
????????光照由直接光和間接光組成,計算光照最常用的就是phong模型了,它是一個經(jīng)驗模型,參數(shù)信息都是經(jīng)驗得到的,并沒有實際的物理意義,所以利用Phong模型會出現(xiàn)違背物理規(guī)則的時候。
漫反射Difuse + 鏡面發(fā)射Specular + 環(huán)境光Ambient = Phong
?????????(3). 混合與測試
????????輸出合并(Output-Merger):在DirectX中,該階段被稱為輸出合并階段,而OpenGL將其稱為逐片元操作(Per-Fragment Operations),從稱呼中就可以看出,這個階段主要是對每一個片元進行一些輸出合并操作,包括Alpha測試、模板測試、深度測試和混合等,它的主要任務是決定片元的可見性,對通過測試的片元顏色進行混合
????????Alpha測試:通過片元數(shù)據(jù),可以獲取該片元的alpha值,如果alpha值小于某個數(shù)的話,則直接將該片元丟棄,不進行渲染
????????模板測試:GPU會首先讀取模板緩沖區(qū)中該片元位置的模板值,然后將該值和讀取到的參考值進行比較,例如小于時舍棄該片元,或者大于等于時舍棄該片元。
????????深度測試:近處的物體會遮擋遠處的物體,這種效果我們可以通過深度測試來模擬實現(xiàn)。
????????混合:對于半透明物體,我們就需要使用混合操作來讓這個物體看起來是透明的
e. 幀緩存
????????可以簡單理解為一個臨時畫布,GPU渲染完成的信息會存放在幀緩存區(qū),等待使用,上述各種測試也是在幀緩沖區(qū)進行的
以下這個圖更容易理解:
自己理解簡而言之就是:
描點(坐標變換)->?
連線(三角面)->
形成格子(光柵化)->
上色(紋理、光照、) ->
后期處理(測試、混合)
2. 幾個和Shader相關的概念
(1)網(wǎng)格(Mesh)
????????網(wǎng)格Mesh是GameObject的3D骨架,它是有頂點(Vertex)定義的一個2D多邊形,這些頂點是3D空間中存儲為XYZ坐標。網(wǎng)格還包括法線,Shader通過法線讓面看起來更光滑。
(2)貼圖、紋理(Maps、textures)
????????紋理(Texture):2D 圖像文件,它像一張紙一樣環(huán)繞GameObject,以設置網(wǎng)格中的顏色、鏡面反射或金屬度、物理紋理和其他屬性。圖像文件的數(shù)據(jù)被組織為通道(RGB/RGBA)。
????????底圖紋理(Base Map Texture):一個常規(guī) RGB 或 RGBA 彩色圖像文件,用于定義對象表面的漫反射(即顏色)
????????平鋪紋理(Tiled Texture):平鋪紋理的紋理設計為圍繞任何網(wǎng)格平鋪。每個文件中的地圖就像地板上的瓷磚一樣簡單地重復
????????UV貼圖:對于像球體這樣的基元和像我們的塊這樣的簡單形狀,紋理貼圖在哪些點與對象的網(wǎng)格對齊并不重要。但是在角色模型等詳細對象上,紋理貼圖與網(wǎng)格的對齊非常重要
????????Alpha裁剪(Alpha Clip):根據(jù)Mesh網(wǎng)格填充紋理,避免大量計算。(也可用于溶解效果、消失/出現(xiàn)效果)
????????凹凸貼圖(Bump Texture):使用凹凸貼圖,著色器將表面細節(jié)的外觀添加到網(wǎng)格中,而無需實際添加多邊形。這種技術對性能更好。使用法線貼圖和高度貼圖(normal maps and height maps)
????????法線貼圖:通過設置頂點位置,使著色器創(chuàng)建表面上的片段(像素)面向不同方向的錯覺。
????????高度貼圖:設置網(wǎng)格中每個像素的相對高度
????????遮擋貼圖(Occlusion Map):遮擋貼圖為這些遮擋區(qū)域添加陰影。
????????發(fā)射貼圖(Emission Map):制作發(fā)光效果的貼圖
(2)反射
????????環(huán)境光遮蔽AO(Occlusion):大部分情況下,AO通過構造一個發(fā)射光線的半(hemisphere)來計算。半球上表面布滿朝各個方向發(fā)射的光線,然后判斷這些光線是否與其它的物體相交。如果光線到達背景或者天空,那么就增加這個光線發(fā)出點的表面亮度,如果與其他物體相交,則不用。(靠得非常近的物體之間的陰影效果會非常明顯)
????????漫反射(Base map):
? ? ? ? 1. 反照率(Albedo):描述了漫反射的測量。它通常指定為常規(guī)顏色,表示為紅色、綠色和藍色的三個值(RGB 值)。RGB 值可以轉換為色調、飽和度和亮度(亮度)的值。反照率顏色的亮度對應于漫反射的量,色調和飽和度描述了從表面逸出的光的質量。
????????2. 地圖(Map):地圖可以是純色的,也可以用 2D 圖像指定以增加表面的變化。
????????鏡面反射(Specular):鏡面反射作為材料的一種屬性,是一種指定表面看起來像金屬的方法。您可以使用兩種工作流程來指定材質中的金屬外觀——Specular、Metallic
????????平滑度(Smoothness):平滑度,也稱為光澤度或光澤度,使鏡面反射成為焦點。
3. 如何編寫Shader
(1). ShaderLab
????????ShaderLab 是一種在著色器源文件中使用的類C語言的聲明性語言。它使用嵌套大括號語法來描述 Shader 對象。其結構如下:
Shader "Examples/ShaderSyntax"
{
CustomEditor = "ExampleCustomEditor"
Properties
{
// 此處是材質屬性聲明
}
SubShader
{
// 此處是定義子著色器的其余代碼
Pass
{
// 此處是定義通道的代碼
}
}
Fallback "ExampleFallbackShader"
}
ShaderLab是一種聲明式語言格式來編寫Shader,可在代碼自由編寫Shader支持的所有特性和屬性,并設置回退行為。
(2). HLSL
都是著色語言,作為中間語言(Intermediate Language),即交給GPU可以理解的語言。文章來源:http://www.zghlxwxcb.cn/news/detail-731092.html
因為Microsoft和NVIDIA合作,所以Cg/HLSL實際上是同一種語言。而ShaderLab內部可以嵌套Cg/HLSL語言編寫著色代碼,需要嵌套在命令CGPROGRAM和ENDCG之間。如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-731092.html
Pass {
// Pass 的標簽和狀態(tài)設置
CGPROGRAM
// 編譯指令
#pargma vertex vert
#pargma fragment frag
// CG代碼
ENDCG
// 其他設置
}</pre>
到了這里,關于Unity(三) Shader著色器初探的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!