Unity-Shader編寫基礎及注意事項(二)

Unity-Shader編寫基礎及注意事項(二)

  1. 座標系規則:Unity中存在空間座標系模型座標系相機座標系以及屏幕座標系。注意:空間座標系和模型座標系均是左手座標系,+z在物體的正前方,相機座標系是右手座標系,+z指向相機後方。
  2. 座標系變換:包含平移、旋轉和縮放變換。注意:三維座標的平移不能用3X3矩陣表示,所以擴展到4X4的齊次座標。Unity-Shader中大多數用到4X4齊次矩陣變換,如下公式爲座標變換原理。
  1. 點積(內積)與叉乘(外積):記住一句順口溜就好,點積計算角度,叉乘判斷方位。比如:你要判斷敵人在你什麼方位,通過點積可以計算敵人與你的夾角度數,但不知道敵人在你的左邊還是右邊,這個時候叉乘便可以計算你與敵人的方位。

  2. Unity中的Shader一般包括四種:
    (1)Standard Surface Shader:包含標準光照模型,基於物理渲染的標準表面着色器,這個可以使用於大多數的模型渲染,除非需要添加其他特效才需要自己編寫,否則一般unity自帶的shader就夠用了。
    (2)Unlit Shader:不包含光照模型,包含霧效的頂點/片元着色器。
    (3)Image Effect Shader:爲實現各種屏幕後效提供了一個模板。
    (4)Compute Shader:不參與渲染流程,這可以說是CPU利用GPU並行高效計算的接口。

  3. unity中所謂的表面着色器實質上是頂點/片元着色器的更加高級抽象的表示而已。

  4. 頂點/片元着色器的基本結構如下:

//每個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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章