Unity3D教程寶典之Shader篇:基礎講 基礎知識

基礎講:基本知識


以下內容不需要入門的時候立刻閱讀和理解,建議逐漸深入學習後,不時回來看看即可。

什麼是GPU?
GPU:Graphic Processing Unit,中文翻譯爲“圖形處理器”。顯卡包括(GPU,顯存,顯卡BIOS,顯卡PCB板)。
什麼是Shader?
Shader程序:GPU執行的,針對3D對象進行操作的程序。

Shader有哪幾種?
CG:與DirectX 9.0以上以及OpenGL 完全兼容。運行時或事先編譯成GPU彙編代碼。
HLSL: 主要用於Direct3D。平臺:windows。
GLSL: 主要用於OpenGL。  平臺:移動平臺(iOS,安卓),mac(only use when you target Mac OS X or OpenGL ES 2.0)

爲什麼Shader中選擇CG?
因爲CG/HLSL 比GLSL支持更多的平臺。

Unity3d裏CG輸出什麼?
windows平臺:Direct3D, GPU彙編代碼
mac:OpenGL GPU彙編代碼
flash:flash GPU彙編代碼
ios/android:unity會將CG轉換成GLSL代碼。
總結:也就是除了移動平臺會把CG轉換成GLSL代碼,其餘平臺都是轉換成彙編代碼。

什麼是緩衝?
一個像素有如下緩衝
顏色緩存color buffer/pixel buffer:儲存該點即將顯示的顏色,RGBA值
深度緩存depth buffer/z buffer:儲存該點的深度,z
模板緩存stencil buffer:通常用作限制渲染區域。 更高級用法需結合深度緩衝,例如某像素的模板緩衝值會隨着其是否通過深度緩衝測試而改變。
累積緩存Accumulation Buffer: 與顏色緩衝類似,同樣儲存一個RGBA值。累積緩存是爲合成多幅圖像而設計的,累積緩存提供了一種在保持好的顏色分辨率下實現在場景中“多重曝光(multiple exposures)”的方法。使用累積緩存可以產生許多圖像效果來提高圖像的真實性,其中包括:反走樣、運動模糊、軟陰影、深度域(景深)和卷積。要產生這些效果,必須將圖像渲染多次,對場景位置(或所選的物體)進行微小的、漸增的改變,然後累積結果。

什麼是圖元裝配(Primitive Assembly)
經過變換的頂點 被 裝配成幾何圖元

什麼是光柵化(又譯作柵格化,Rasterization)
柵格化這個術語可以用於任何將矢量圖形轉換成柵格圖像的過程。
在3D渲染中主要是指, 三角形等圖元(矢量)轉換成像素碎片的過程。或者說決定哪些像素幾何圖元覆蓋的過程。光柵化的結果是像素位置的集合和片段的集合

什麼是光柵操作(Raster Operation)
指在碎片fragment處理後,在更新幀緩存前最後執行的一系列操作。通過包括裁剪,深度測試,alpha測試,alpha混合等。

碎片Fragment等於像素嗎?
像素點:(屏幕上能顯示)的最小圖像單元
像素:幀緩存中某個像素點的內容,通常即指顏色。
碎片:更新像素潛在需要的一個狀態。
碎片輸出的是當前的fragment函數在這個像素點的顏色,並不代表這像素點的最終顏色。最後顯示的顏色是這個點的所有碎片經過疊加等運算形成的最終結果。

針對3D對象進行操作、並被GPU所執行的程序

什麼是地形着色器(Geometry Shader):
幾何着色器可以從多邊形網格中增刪頂點。它能夠執行對CPU來說過於繁重的生成幾何結構和增加模型細節的工作。Direct3D版本10增加了支持幾何着色器的API, 成爲Shader Model 4.0的組成部分。OpenGL只可通過它的一個插件來使用幾何着色器,但極有可能在3.1版本中該功能將會歸併。幾何着色器的輸出連接光柵化器的輸入。但是並不實用。

什麼是Tessellation?
針對DX11. 該技術需要消耗大量硬件資源,因此開發人員不會在場景中的每個地方都使用它,一般只考慮玩家視角近景和輪廓邊緣。利用GPU硬件加速,將現有3D模型的三角形拆分得更細小、更細緻,也就是大大增加三角形數量,使得渲染對象的表面和邊緣更平滑、更精細。



                                 座標系

計算機3D中,3D座標系採用的主要是,
笛卡兒座標系(Cartesian座標系),也稱直角座標系。
當x軸朝右,y朝上,z朝屏幕裏的時候,爲左手座標系。
當x軸朝右,y朝上,z朝屏幕外即面朝你的時候,爲右手座標系。
所以,Unity使用的是左手座標系。
D3D左手 即 裁剪空間裏(x,y,z,w) z= z/w   即[0,1]
OpenGL使用右手 ,即 裁剪空間裏(x,y,z,w) z= (z/w + 1)/2 即[-1,1]


#pragma target 3.0    :定義Shader模型爲Shader Model 3.0,
2.0, Direct3D 9 (默認缺省值)。支持32張貼圖 + 64個計算
3.0, Direct3D 9支持512張貼圖 + 512個計算
4.0, 只支持DirectX 11。
5.0, 只支持DirectX 11。


【Unity Shader內置矩陣】
UNITY_MATRIX_MVP        當前模型視圖投影矩陣
UNITY_MATRIX_MV           當前模型視圖矩陣
UNITY_MATRIX_V              當前視圖矩陣。
UNITY_MATRIX_P              目前的投影矩陣
UNITY_MATRIX_VP            當前視圖*投影矩陣
UNITY_MATRIX_T_MV       移調模型視圖矩陣
UNITY_MATRIX_IT_MV      模型視圖矩陣的逆轉
UNITY_MATRIX_TEXTURE0   UNITY_MATRIX_TEXTURE3          紋理變換矩陣

注意:View矩陣並不是相機的matrix(xy一致,z是反的,也就是相機下的子物體(1,1,1)在
UNITY_MATRIX_MV實際是(1,1,-1))



【Unity Vertex Data】

Unity頂點函數的輸入數據 appdata 在UnityCG.cginc中定義,有以下三種

【1 appdata_base】

位置vertex,法線normal,貼圖uv texcoord

struct appdata_base {
    float4 vertex : POSITION;
    float3 normal : NORMAL;
    float4 texcoord : TEXCOORD0;
};


【2 appdata_tan】

位置vertex,法線normal,切線tangent 貼圖uv texcoord

struct appdata_tan {
    float4 vertex : POSITION;
    float4 tangent : TANGENT;
    float3 normal : NORMAL;
    float4 texcoord : TEXCOORD0;
};


【3 appdata_full】

位置vertex,法線normal,切線tangent 貼圖uv texcoord  頂點顏色color    

struct appdata_full {
    float4 vertex : POSITION;
    float4 tangent : TANGENT;
    float3 normal : NORMAL;
    float4 texcoord : TEXCOORD0;
    float4 texcoord1 : TEXCOORD1;
    float4 texcoord2 : TEXCOORD2;
    float4 texcoord3 : TEXCOORD3;
#if defined(SHADER_API_XBOX360)
    half4 texcoord4 : TEXCOORD4;
    half4 texcoord5 : TEXCOORD5;
#endif
    fixed4 color : COLOR;
};

【自定義struct】

:後面加semantics即可

POSITION

NORMAL

TEXCOORD0-6

TANGENT

COLOR

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章