1. 程式人生 > >【Unity Shader】--入門知識點

【Unity Shader】--入門知識點

一個 個數 精確 option cas 反射 性能 hit nor


著色器聲明(“名字”)
Shader "ShaderDiffuseExample"
{
一、屬性定義(作用:外部傳入參數)
屬性定義語法:PropName("DisplayName",PropType) = DefaultValue[{options}]
Properties
{
PropName:屬性名,就是當前Shader的外部傳入數據變量名。

DisplayName:Unity材質編輯器中顯示的參數名,可作為腳本傳參時的Key來給屬性賦值。

PropType:屬性的類型,UnityShader可用的類型有:
Color:顏色,有RGBA四個量來定義。
2D:一個二階(2的n次冪像素)大小的貼圖,這張紋理將在被采樣後按照模型頂點UV進行顏色賦值。
Rect:一個非二階貼圖。
Cube:即為Cube map texture(立方體紋理);立方體紋理是有6張有關系的2D貼圖的組合,
主要用做反射效果(比如天空盒和動態反射),也會被按照對應坐標采樣。
Range(min,max):一個介於最小於最大值之間的浮點數
Float:任意一個浮點數
Vector:任意一個四維數

DefaultValue:屬性默認初始值(當然這些值也是可以在後期用代碼進行再賦值)
Color 格式為(1,1,1,1)
Rect 2D Cube可以用默認代表tini顏色的字符串 + {}:例如"white" "black" "gray" "bump"
Float Range 為浮點數值
Vector 格式為(x,y,z,w)

{options} :只針對於Rect 2D Cube會有的{},在他們初始值後面必須加上一個{},當我們有特點選項時就寫在{}裏面
選項有:ObjectLiner EyeLiner SphereMap CubeReflect CubeNormal(這些都是OpenGL中TexGen的模式)
}

二、子著色器(可以有多個子著色器)
(1)shader分為四種:
1、Fixed function shader 固定著色器
2、Vertex shader 和 Fragment shader 定點著色器和片段著色器
3、Surface shader 表面著色器
4、Compute shader 這是Unity3D新增的一種。看下度娘百科對它的介紹
(2)前三種shader不同點:
1、Vertex shader、Fragment shader、Surface shader可以實現Fixed function shader實現不了的高級功能
2、Vertex shader、Fragment shader、Fixed function shader 的shader主體中有pass{};但是Serface shader
已經把相關內容打包在了光照模型裏了,不能有pass{}。
3、Fixed function shader每句代碼後面不需要加";" 另外2種shader必須要加";"
4、它們的核心結構不同:
Fixed function shader核心結構是 Material{} 以及 SetTexture[_MainTex]{}
Surface shader 核心結構是
①使用Unity自帶光照模型LightModel(如Lambert),也不頂點處理,只需要一個函數surf處理即可。
CGPROGRAM
#pragma surface surf Lambert
ENDCG
②使用自己寫的光照模型LightModel,並且使用頂點處理函數vert
CGPRORAM
// surface 表面處理函數 光照模型 頂點處理:函數
#pragma surface surf lightModel vertex : vert
//執行順序:頂點處理函數->表面處理函數->光照模型函數->顏色值
ENDCG
Vertex shader 和 Fragment shader 核心結構是
CGPROGRAM
#pragma vertex vert
#prgrma fragment frag
#include "Unity.cginc"
ENDCG

SubShader
{
1、Tags修飾:硬件將通過判斷定義的這些標簽來決定什麽時候調用該著色器。Tags其實暗示了Shader的輸出
"RenderType" = "opaque" :在渲染非透明物體時調用
"RenderType" = "opaque" :在渲染透明物體時調用
"IgnorProjector" = "True" : 不被Projector影響
"ForceNoShadowCasting" = "True" : 從不產生陰影
"Queue" = "xxx" : 指定渲染隊列(渲染優先級),預定義的Queue有:
Backgroud = 1000最早被調用的渲染(用於天空盒或者背景)
Geometry = 2000 默認值,用來渲染非透明物體(場景中大部分都是用這個)
AlphaTest = 2450 用來渲染經過AlphaTest的像素(單獨為AlphaTest設定一個Queue是出去效率的考慮)
Transparent = 3000 以從後往前的順序渲染透明物體
Overlay = 4000 用來渲染疊加效果,是渲染的最後階段(例如渲染鏡頭光暈特效)
附:除了用以上預定義的值,還可以自己定義Queue值(如 "Queue" = Transparent + 100,表示在Transparen之後100的Queue上調用)

例子:Tags{"RenderType" = "opaque"}

2、LOD值:它是Level of Detail的縮寫,其實Unity的內建Diffuse著色器的設定值就是200。
這個數值決定了我們能用什麽樣的Shader。在Unity的Quality Settings中我們可以設定允許的最大LOD,
當設定的LOD小於SubShader所指定的LOD時,這個SubShader將不可用。

Unity內建Shader定義了一組LOD的數值,我們在實現自己的Shader的時候可以將其作為參考來設定自己的LOD數值,
這樣在之後調整根據設備圖形性能來調整畫質時可以進行比較精確的控制。
VertexLit及其系列 = 100
Decal, Reflective VertexLit = 150
Diffuse = 200
Diffuse Detail, Reflective Bumped Unlit, Reflective Bumped VertexLit = 250
Bumped, Specular = 300
Bumped Specular = 400
Parallax = 500
Parallax Specular = 600

例子:LOD 200


3、CG程序的主體(必須被包含在CGPROGRAM ... ENDCG之間)

(1)表面著色器:#pragma surface surfaceFuction lightModel[optionalparams]
聲明要寫一個表面著色器,表面著色器函數名稱及指定的光照模型[可附帶參數]
#pragma 聲明著色器關鍵字
surface 聲明著色器類型為表面著色器
surfaceFuction 表面著色器函數名稱
lightModel 使用的光照模型
#pragma target 3.0 表示編譯UnityShaderModel版本


CGPROGRAM
#pragma surface surf Lambert
#pragma vertex vert
#pragma fragment frag
ENDCG

}

三、回滾(在以上所有子著色器都沒能執行時執行回滾)

例子: FallBack "Diffuse"
}

【Unity Shader】--入門知識點