【Unity Shader入門】Shader基礎概念:渲染流水線
【Unity Shader入門】Shader編程基礎:ShaderLab語法
【Unity Shader入門】Shader數學基礎:向量(矢量)
【Unity Shader入門】Shader數學基礎:矩陣
【Unity Shader入門】Shader數學基礎:矩陣變換
【Unity Shader入門】Shader編程初級:Shader結構
Shader數學基礎:向量(矢量)
前言
笛卡爾座標系
二維笛卡爾座標系
一個二維的笛卡爾座標系包含了兩個部分的信息:
一個特殊的位置,即原點,它是整個座標系的中心。
兩條過原點的互相垂直的矢量,即X軸和Y軸。這些座標軸也被稱爲是該座標的矢量。
OpenGL 和 DirectX 使用了不同的二維笛卡爾座標系。OpenGL也就是Unity默認的座標系是以左下角爲原點,DirectX是以左上角爲原點。如下圖:
三維笛卡爾座標系
在三維笛卡爾座標系中,我們需要定義三個座標軸和一個原點
3個座標軸被稱爲該座標系的基矢量,3個座標軸互相垂直,長度爲1,這樣的基矢量被稱爲標準正交基,如果長度不爲1,被稱爲正交基。當然,座標軸方向也不是固定的,涉及到z軸向裏爲正還是向外爲正,也就有了大家熟知的左手座標系和右手座標系。
三維笛卡爾座標系分爲2種不同的座標系:左手座標系(left-handed coordinate space)和右手座標系(right-handed coordinate space)。
Unity使用的是左手座標系。但對於觀察空間來說,Unity使用的是右手座標系。觀察空間,通俗來講就是以攝像機爲原點的座標系。在這個座標系中,攝像機的前向是z軸的負方向,這與在模型空間和世界空間中的定義相反。也就是說,z軸座標的減少意味着場景深度的增加。
點和向量
介紹
點(point):是n維空間(遊戲中主要使用二維和三維空間)中的一個位置,它沒有大小、寬度這類概念。
向量(vector,也被稱爲矢量):是指n維空間中一種包含了模(magnitude)和方向(direction)的有向線段。速度(velocity)就是一種典型的向量。向量被用於表示相對於某個點的偏移,也就是說是一個相對量。
向量的模:指的是這個向量的長度。一個向量的長度可以是任意的非負數。
向量的方向:則描述了這個向量在空間中指向。
向量通常由一個箭頭表示
向量的頭(head):是它的箭頭所在的端點處。
向量的尾(tail):是另一個端點處。
只要向量的模和方向保持不變,無論在哪裏,都是同一個向量。
標量(scalar):只有模沒有方向。例如距離(distance)就是一種標量。
區別
向量可以用於表示相對於另一個點的位置,此時向量的尾是一個位置,那麼向量的頭就可以表示另一個位置了。如果我們把向量的尾固定在座標系原點,那麼這個向量的表示就和點的表示重合了。儘管點和向量在數學表達式上都是一樣的,但區分點和向量之間的不同是非常重要的。可以這樣理解,任何一個點都可以表示成一個從原點位置出發的向量。
點:沒有大小之分的空間中的位置
向量:有模和方向,但是沒有位置的量,相對量(可以描述相對位置),如果向量的頭尾都固定在座標系的原點,則這個向量就和點重合了。
向量運算
向量和標量的乘法和除法
把一個向量和一個標量相乘,意味着對向量進行一個大小爲標量的縮放。
一個向量也可以被一個非零的標量除。這等同於和這個標量的倒數相乘。
注意:對於乘法來說,向量和標量的位置可以互換的。但對於除法,只能是向量被標量除,而不能是標量被向量除,這是沒有意義的。當k<0時,向量的方向也會取反。
例如,如果想把一個向量放大兩倍,就乘以2,。當標量小於0時,向量的方向也會相反。
向量的加法和減法
兩個向量進行相加或相減,其結果是一個相同維度的新向量。需要注意的是,一個矢量不能和一個標量相加或相減。矢量的加減法遵守三角法則。
向量的模
向量的模是一個標量,是向量在空間中的長度。對於二維向量,其實就是使用了勾股定理,兩個直角邊的長度爲向量的分量的絕對值,斜邊的長度爲向量的模。
單位向量
很多情況下,我們只關心向量的方向而不是模。比如光照模型中,往往需要知道法線方向和光源方向,這種情況下我們不關心向量有多長,這樣就需要計算單位向量。單位向量指的是模爲1的向量,也被稱爲被歸一化的向量(normalized vector),而把非零向量轉換爲單位向量的過程被稱爲歸一化。計算單位向量公式如下:
向量點積
點積有兩種定義方式:代數方式和幾何方式。通過在歐氏空間中引入笛卡爾座標系,向量之間的點積既可以由向量座標的代數運算得出,也可以通過引入兩個向量的長度和角度等幾何概念來求解。
代數方式
矢量的點積滿足交換律:
點積具有一些很重要的性質,在Shader計算中,我們經常利用這些性質來幫助計算。
性質一:點積可以結合標量乘法,也就是說,對點積中其中一個矢量進行縮放的結果,相當於對最後的點積結果進行縮放,即:
性質二:點積可以結合矢量加法和減法,也就是說,點積的操作數可以是矢量相加或相減後的結果。即:
性質三:一個矢量和本身進行點積的結果,是該矢量的模的平方,這可以用來比較兩個矢量的長度大小。
幾何方式
兩個矢量的點積可以表示爲兩個矢量的模相乘,再乘以他們之間夾角的餘弦值。
利用餘弦定理推導:
從這個公式可以看出兩個向量的夾角對於點積結果的影響,小於90度爲正,等於90度爲0,大於90度爲負。還可以用反餘弦求出兩個向量的夾角。
幾何意義
點積的幾何意義中一個重要的幾意義是投影(projection),點積的符號可以讓我們知道兩個矢量的方向關係。
向量叉積
叉積在圖形學中常用於計算垂直於一個三角面的向量,用於判斷三角面片的朝向等。
三維向量叉積的計算規律。不同顏色的線表示了計算結果向量中對應顏色的分量的計算路徑。
以紅色爲例,即結果向量的第一個分量,它是從第一個向量的y分量出發乘以第二個向量的z分量,再減去第一個向量的z分量和第二向量的y分量的乘積
向量的叉積滿足反交換律:
向量的叉積不滿足交換律,也不滿足結合律:
叉積的幾何意義:
兩個向量叉積會得到一個同時垂直於這兩個向量的新向量
我們知道兩個方向互不平行的向量可以確定一個平面,所以叉積最常見的應用就是計算垂直於一個平面的向量,我們後面會在頂點法線,切線那裏用到。