寫shader的時候經常碰到模型空間坐標轉裁剪空間坐標,裁剪空間坐標轉世界空間坐標的需求.
模型空間
模型空間也被稱為對象空間和局部空間.簡單地可以理解為建模的時候規定好的一系列坐標.
世界空間
在unity中,如果一個gameObject沒有父物體,則它的transform.position就是世界空間的坐標.
如果有父物體,則它的transform.position是父物體模型空間下的坐標,而不是世界空間的位置.
觀察空間
觀察空間也被稱作攝像機空間
與模型和世界空間不同的是,觀察的空間的+z軸指向攝像機的后方,攝像機的前方是-z軸.
加入當前camera相對於原點的坐標為transform.position.xyz,那么相當於在世界空間內平移了(+8.25,+0.62,-10)
要找到世界空間到觀察空間的矩陣時,相當於將這個平移做的逆變換,即(-8.25,-0.62,+10),如果有旋轉情況,則矩陣 M(世界空間到觀察空間) =[旋轉矩陣][平移矩陣].
觀察空間的是右手坐標系,所以矩陣Z方向需要取反
裁剪空間
裁剪過程中,位於空間內的圖元被保留,位於空間外的圖元被剔除.裁剪的過程遵循正交投影和透視投影矩陣運算.
頂點從觀察空間到裁剪空間的矩陣叫裁剪矩陣.
屏幕空間
將裁剪空間坐標投影到屏幕空間坐標,使用齊次除法.
其他
在unity shader中,坐標從模型->世界->觀察->裁剪這一步其實是封裝好了的,
struct v2f{
//用於在頂點和片元着色器之間傳遞信息
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
v2f vert(a2v v){
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
return o;
}
SV_POSITION告訴unity,pos冒號右邊的數據就是頂點在裁剪空間的位置信息.