數學對於計算機圖形學的重要性是不言而喻的。在學習Shader以前,首先就要打好數學基礎,好在入門Unity Shader所需的數學知識都是線性代數中很基礎的的內容。循序漸進的來,第一篇文章記錄總結的是座標系,點,矢量等概念以及簡單的運算。本文主要源自《Unity Shader入門精要》一書的讀書筆記。
若是有小夥伴對Shader着色器相關的概念還不瞭解的話,能夠先看下這篇文章一篇文章搞懂到底什麼是渲染流水線html
在三維笛卡爾座標系中,咱們須要定義3個座標軸和一個原點。這3個座標軸被稱爲該座標系的基矢量,相互垂直且長度爲1的基矢量被稱爲標準正交基,相互垂直但長度不爲1的基矢量被稱爲正交基學習
咱們能夠利用雙手來判斷一個座標系的旋向性。請讀者舉起你的左手,用食指和大拇指擺出一個「L」的手勢,而且讓你的食指向上,大拇指向右。如今伸出你的中指,它將指向你的前方。此時你已經獲得了一個左手座標系。你的大拇指,食指,中指分別對應了+x,+y,+z軸。以下圖所示。
3d
讀者能夠經過右手獲得一個右手座標系。舉起你的右手,此次食指仍然向上,中指指向前方,不一樣的是,大拇指將指向左側。以下圖所示。
htm
左手座標系和右手座標系對於正向旋轉的定義也不一樣,分別取決於左手法則和右手法則。在左手座標系中,請舉起你的左手,握拳,伸出大拇指讓它指向旋轉軸的正方向,那麼旋轉的正方向就是剩下4個手指的彎曲方向。在右手座標系中,使用右手法則對旋轉正方向的判斷相似。
blog
對於模型空間和世界空間,Unity使用的是左手座標系。
對於觀察空間,Unity使用的是右手座標系。觀察空間通俗來說就是以攝像機爲原點的座標系,攝像機的前向是z軸的負方向,也就是說,z軸座標的減小意味着場景深度的增長。
get
點是n維空間中的一個位置。
矢量是指n維空間中一種包含了模和方向的有向線段。而標量只有模沒有方向。
具體來說:數學
一般矢量被用於表示相對於某個點的偏移,也就是說只要矢量的模和方向不變,不管放在哪裏,都是同一個矢量。it
矢量能夠用於表示相對於另外一個點的位置,此時矢量的尾是一個位置,那麼矢量的頭就能夠表示另外一個位置了。若是咱們把矢量的尾固定在座標系原點,那麼這個矢量的表示就和點的表示重合了。儘管點和矢量在數學表達式上都是同樣的,但區分點和矢量之間的不一樣是很是重要的。能夠這樣理解,任何一個點均可以表示成一個從原點位置出發的矢量。入門
咱們不能把矢量和標量進行相加/相減的運算(想象一下,你會把矢量速度和標量距離相加嗎)。
對矢量和標量進行乘法運算,會獲得一個不一樣長度且可能方向相反的新的矢量。讀書筆記
注意:對於乘法來講,矢量和標量的位置能夠互換。但對於除法來講,只能是矢量除以標量,而不能是標量除以矢量,這是沒有意義的。
把一個矢量和一個標量相乘,意味着對矢量進行一個大小爲標量的縮放。例如,若是想把一個矢量放大兩倍,就乘以2,。當標量小於0時,矢量的方向也會相反。
咱們能夠對兩個矢量進行相加或相減,其結果是一個相同維度的新矢量
須要注意的是,一個矢量不能夠和一個標量相加或相減,也不能和不一樣維度的矢量進行運算。
在圖形學中矢量一般用於描述位置偏移(簡稱位移)。對於加法,咱們能夠把矢量a的頭鏈接到矢量b的尾,而後畫一條從a的尾到b的頭的矢量,來獲得a和b相加的矢量。也就是說,若是咱們從一個起點進行了一個位置偏移a,而後進行了一個位置偏移b,那麼就等同於進行了一個a+b的位置偏移。矢量的減法也是相似的。
假設,空間內有兩點a和b。咱們能夠用矢量a和b來表示它們相對於原點的位移。若是咱們想要計算點b相對於a的位移,就能夠經過把b和a相減獲得。
矢量的模是一個標量,能夠理解爲是矢量在空間中的長度。
矢量的表示符號一般是在矢量兩旁分別加上一條垂直線
從幾何意義上來理解二維矢量,咱們能夠對任意矢量構建一個三角形,以下圖所示。能夠看出,其實就是使用了勾股定理,矢量的兩個份量的絕對值對應了三角形兩個直角邊的長度,而斜邊的長度就是矢量的模。
在不少狀況下,咱們只關心矢量的方向而不是模。在這些狀況下,咱們就須要計算單位矢量。
單位矢量指的是模爲1的矢量。單位矢量也被稱爲歸一化的矢量。對任何給定的非零矢量,把它轉換成單位矢量的過程被稱爲歸一化。
爲了求解單位矢量,咱們能夠用矢量除以該矢量的模獲得。
零矢量(每一個份量都是0的矢量)是不能夠被歸一化的。這是由於作除法運算時分母不能爲0.
對於二維空間來講,咱們能夠畫一個單位圓(半徑爲1),那麼單位矢量就能夠是從圓心出發到圓邊界的矢量。在三維空間中,單位矢量就是從一個單位球的球心出發,到達球面的矢量。
矢量之間也能夠進行乘法,矢量的乘法有兩種最經常使用的種類:點積(內積)和叉積(外積)。矢量的點積結果是一個標量
公式1,兩個三維矢量的點積是把兩個矢量分別對應份量相乘後再取和
公式2,矢量的點積等於兩個矢量的模乘以cosθ(θ表示兩個矢量的夾角)
公式2的推導,以下所示。
重點是爲何等於cosθ,以下圖所示,紅色線段就是|b|*cosθ = cosθ
點積的幾何意義很重要,由於點積幾乎應用到了圖形學的各個方面。其中一個幾何意義就是投影。
投影是什麼意思?加入如今有一個光源,它發出的光線是垂直於單位矢量a方向的,那麼矢量b在a方向上的投影就是b在a方向上的影子。
投影結果的正負號與a和b的方向有關:當它們的方向相反(夾角大於90°)時,結果小於0。當它們的方向相同(夾角小於90°)時,結果大於0。當它們互相垂直(夾角爲90°)時,結果等於0。這一點利用公式2也能夠看出來,結果的正負取決於cosθ。
那麼若是a(前面所說的投影都要求a是單位矢量)不是一個單位矢量會如何呢,很簡單,任何兩個矢量的點積a·b等同於b在a方向上的投影,再乘以a的模。
點積能夠結合標量乘法
點積可結合矢量加法/減法
利用公式2,能夠計算兩個矢量之間的夾角
與點積不一樣的是,矢量叉積的結果還是一個矢量,而非標量。
須要注意的是叉積不知足交換律,可是知足反交換律。即a×b = -(b×a)
對兩個矢量進行叉積的結果會獲得一個同時垂直於這兩個矢量的新矢量
叉積最多見的一個應用就是計算獲得垂直於一個平面,三角形的矢量。
新矢量的模等於a和b的模的乘積再乘以它們之間夾角的正弦值,計算公式以下:
這和平行四邊形的面積計算公式是同樣的,即底乘以高,能夠認爲新矢量的模是兩個矢量圍成的四邊形的面積。
新矢量的方向,就是和兩個矢量垂直的方向,但實際上咱們有兩個方向能夠選擇。具體如何選擇,須要依據左手座標系或右手座標系來判斷。
以右手座標系爲例,使用右手法則來判斷。先把手心放在a和b的尾的交點處,而後張開手掌讓手掌的方向和a的方向重合,再彎曲四指讓它們向b的方向靠攏,最後伸出大拇指,大拇指的指向就是a×b的方向。對於左手座標系使用左手法則來判斷也是相似的。