Unity-Shader編寫基礎及注意事項(二)
- 座標系規則:Unity中存在空間座標系,模型座標系,相機座標系以及屏幕座標系。注意:空間座標系和模型座標系均是左手座標系,+z在物體的正前方,相機座標系是右手座標系,+z指向相機後方。
- 座標系變換:包含平移、旋轉和縮放變換。注意:三維座標的平移不能用3X3矩陣表示,所以擴展到4X4的齊次座標。Unity-Shader中大多數用到4X4齊次矩陣變換,如下公式爲座標變換原理。
-
點積(內積)與叉乘(外積):記住一句順口溜就好,點積計算角度,叉乘判斷方位。比如:你要判斷敵人在你什麼方位,通過點積可以計算敵人與你的夾角度數,但不知道敵人在你的左邊還是右邊,這個時候叉乘便可以計算你與敵人的方位。
-
Unity中的Shader一般包括四種:
(1)Standard Surface Shader:包含標準光照模型,基於物理渲染的標準表面着色器,這個可以使用於大多數的模型渲染,除非需要添加其他特效才需要自己編寫,否則一般unity自帶的shader就夠用了。
(2)Unlit Shader:不包含光照模型,包含霧效的頂點/片元着色器。
(3)Image Effect Shader:爲實現各種屏幕後效提供了一個模板。
(4)Compute Shader:不參與渲染流程,這可以說是CPU利用GPU並行高效計算的接口。 -
unity中所謂的表面着色器實質上是頂點/片元着色器的更加高級抽象的表示而已。
-
頂點/片元着色器的基本結構如下:
//每個Shader都有一個專屬 名字,冒號裏面的便是Unity面板顯示的shader名字
Shader "MyShader"{
//shader中計算或是傳遞所需要的屬性,在Unity面板中可以顯示所需要的屬性,如貼圖,顏色等
Properties{
}
//針對顯卡A的Shader
SubShader{
//及其重要的部分,一個pass代表一次2渲染,基本上大部分代碼都寫在Pass塊中
Pass{
//先設置渲染狀態和標籤
//這裏開始CG代碼的編寫
CGPROGRAM
//聲明頂點/片元着色器函數名分別爲vert和frag
#pragma vertex vert
#pragma fragment frag
//頂點着色器函數
//POSITION以及SV-POSITION爲CG/HLSL中的語義,該語義不可忽略,他告訴函數需要哪些輸入和輸出,其中POSITION告訴vert函數的輸入v,將模型頂點座標填入v中;SV-POSITION告訴函數輸出返回值爲裁剪空間的頂點座標。
float4 vert(float4 v:POSITION):SV_POSITION
{
return mul(UNITY_MATRIX_MVP,v);
}
//片元着色器函數
float4 frag():SV_Target
{
return fixed4(1.0,1.0,1.0,1.0);
}
//這裏結束CG代碼的編寫
ENDCG
}
}
//針對顯卡B的Shader
SubShader{
}
//上述SubShader都失敗時調用低級的渲染Shader
Fallback “VertexLit”
}
- ShaderLab屬性類型和CG變量類型關係:
ShaderLab屬性類型 | CG變量類型 |
---|---|
Color,Vector | float4,half4,fixed4 |
Range,Float | float,half,fixed |
2D | sampler2D |
3D | sampler3D |
- 內置包含文件,類似於C++中頭文件的引用:
CGPROGRAM
......
#include "UnityCG.cginc"
......
ENDCG