GAMES101-現(xiàn)代計(jì)算機(jī)圖形學(xué)入門-閆令琪

Games101 個人筆記(更新至Lecture6)
- 我也是剛?cè)腴T的小白,記筆記主要是為了幫助自己鞏固知識點(diǎn),希望也能對小伙伴們造成一點(diǎn)微弱的幫助!
- 筆記中可能會有寫錯的地方,請各位大佬批評指正~~
---------------------------------------------------
Lecture2 線性代數(shù)簡單總結(jié)
向量的點(diǎn)乘
可以判斷向量前與后的信息
點(diǎn)乘>0 同方向
點(diǎn)乘<0 反方向

向量的叉乘
輸入兩個向量,輸出一個同時垂直與這兩個向量的新向量
如何判斷新向量的方向?
右手螺旋定則
如a×b=c
四指從a的方向向b的方向握緊,大拇指指向的就是c的方向

如何判斷兩個向量的左右關(guān)系?
a×b得到結(jié)果是和z軸同向,是正的,說明b在a的左側(cè)
如何判斷一個點(diǎn)是否落在三角形內(nèi)部?(做光柵化,給三角形內(nèi)部的像素著色需要用到)
AB×AP > 0 說明P在AB左側(cè)
BC×BP > 0 說明P在BC左側(cè)
CA×CP > 0 說明P在CA左側(cè)
說明點(diǎn)P落在三角形ABC內(nèi)部
矩陣
矩陣的乘積
首先兩個矩陣必須要可以相乘
(M x N)(N x P) = (M x P)
第一個矩陣的列==第二個矩陣的行。才能相乘
如:
第一個矩陣M行N列
第二個矩陣N行P列
得到M行P列的新矩陣
新矩陣a行b列的元素怎么得出來呢?
第一個矩陣a行和第二個矩陣b列做點(diǎn)積運(yùn)算
如:
二行三列
5*9 +2*8 = 61

矩陣的性質(zhì)

矩陣乘向量

矩陣的轉(zhuǎn)置

單位矩陣、矩陣的逆

向量的點(diǎn)乘、叉乘(矩陣形式)
向量的點(diǎn)乘(矩陣形式)(見下圖)
向量的叉乘(矩陣形式)
將a向量重新組織,變?yōu)锳*這個矩陣,A*這個矩陣叫a向量的伴隨矩陣
A*乘以b就是axb的結(jié)果
(Lecture4的羅德里格斯旋轉(zhuǎn)公式會用到這個性質(zhì))

------------------------------------------------------------
Lecture3 變換簡單總結(jié)
縮放變換
Sx 0
0 Sy 就叫縮放矩陣,與xy點(diǎn)乘得到縮放后的矩陣

鏡像變換

錯切變換
對于圖片來說每個點(diǎn)的y坐標(biāo)都沒變
對于左上角的點(diǎn)來說變化應(yīng)該是0+a
對于右上角的點(diǎn)來說變化應(yīng)該是1+a
對于左邊中間的點(diǎn)來說變化應(yīng)該是0+a/2
所以每個點(diǎn)的變化應(yīng)該是x+ay
故矩陣如圖

旋轉(zhuǎn)
默認(rèn)繞(0,0)轉(zhuǎn),默認(rèn)逆時針旋轉(zhuǎn)

公式推導(dǎo)

如果用一個矩陣乘以輸入可以得到輸出的坐標(biāo),那么稱這個變換叫線性變換

平移
平移可以寫成
x = x + tx
y = y + ty
矩陣如圖,無法寫成線性變換的樣子,為了解決平移這個特例,人們引入齊次坐標(biāo)
齊次坐標(biāo)
(齊次坐標(biāo)這里老師講的非常透徹,深入淺出,忘記了知識點(diǎn)的話建議直接看視頻)


2D變換的齊次坐標(biāo)形式

先旋轉(zhuǎn)在平移寫作 (T·R·向量) 從右往左寫
------------------------------------------------------------
Lecture4 變換進(jìn)階篇

3D變換
3D變換相對于2D變換來說只是多增加了一個維度,可由2D變換舉一反三得來

3D旋轉(zhuǎn)
3D旋轉(zhuǎn)在繞Y軸旋轉(zhuǎn)時理解有些特殊

以xyz三個軸來說
X x Y = Z Y x Z = X X x Z = -Y
所以繞Y軸旋轉(zhuǎn)的矩陣表現(xiàn)出來是轉(zhuǎn)置的狀態(tài)
羅德里格斯旋轉(zhuǎn)公式
我們說在三維空間內(nèi)繞某一軸旋轉(zhuǎn),默認(rèn)這個軸是過原點(diǎn)的
羅德里格斯旋轉(zhuǎn)公式就是總結(jié)了繞任意過原點(diǎn)的軸旋轉(zhuǎn)的公式

拆分一下羅德里格斯旋轉(zhuǎn)公式(下圖來自百度百科)

對于繞不過原點(diǎn)的軸旋轉(zhuǎn),我們可以將其拆分為
- 將旋轉(zhuǎn)軸平移到原點(diǎn)
- 繞軸旋轉(zhuǎn)
- 將旋轉(zhuǎn)后的模型平移回去
視圖/相機(jī)變換
圖形學(xué)的最終目的是為了將三維中的物體渲染成二維里的圖像
在現(xiàn)實(shí)生活中如何照一張照片?
- 找個好地方擺pose(Model變換)
- 把相機(jī)放個好角度(View變換)
- 按快門(Projection變換)
View變換--如何擺放相機(jī)的角度
- 決定相機(jī)的位置
- 決定相機(jī)看向的方向
- 決定相機(jī)頭朝上的方向

規(guī)定相機(jī)永遠(yuǎn)在(0,0,0),沿著-Z看
變化的永遠(yuǎn)是其他物體

所以要先把攝像機(jī)歸到原點(diǎn)
- 平移攝像機(jī)至(0,0,0)
- 將相機(jī)lookat的方向旋轉(zhuǎn)到-z
- 旋轉(zhuǎn)相機(jī)頭朝上的方向到Y(jié)

第一步的平移可以簡單的寫成下圖Tview

但是要將任意向量旋轉(zhuǎn)到軸上比較難寫(也就是第2步和第三步)
但是將軸(如X軸(1,0,0))旋轉(zhuǎn)到任意向量比較好寫
所以我們先求將X軸旋轉(zhuǎn)到任意向量的矩陣,之后將該矩陣求逆,即可得到任意向量旋轉(zhuǎn)到軸的矩陣Rview
Rview x Tview = Mview
Mview即為視圖變換,將Mview應(yīng)用到相機(jī),相機(jī)歸零,同時也需要將Mview應(yīng)用到其他所有物體,讓物體和相機(jī)的相對位置保持不變
投影
正交投影
先將相機(jī)歸零lookat -Z軸
對于二維投影來說,直接把Z軸坐標(biāo)舍棄,就能得到物體在xy平面上的投影
要把得到的圖像平移并且縮放到[-1,1]2中,方便之后的計(jì)算
對于正交投影來說,視口是個[l,r][b,t][f,n]的長方體,想讓他變成[-1,1]3中的話只需要
- 先將立方體的中心平移到原點(diǎn)
- 在將立方體縮放到[-1,1]3中
首先要找到立方體的中心點(diǎn),也就是

將邊長r-l、t-b、n-f縮放到長度2
所以正交投影矩陣如下

(此時物體肯定會被拉伸,在之后的視口操作中會恢復(fù)拉伸)

透視投影
傳統(tǒng)的歐式幾何是在同一平面內(nèi)生效的法則
對于不同平面就會造成照片中近大遠(yuǎn)小的情況

如何做透視投影呢?(本分P難點(diǎn)?。?/p>

老師的方法是,先將Frustum遠(yuǎn)平面及遠(yuǎn)平面到近平面之間的所有平面擠壓到近平面大小,
變成Cuboid的樣子,然后做一次正交投影
那么如何做擠壓呢?
- 對于除近平面外的任意一個點(diǎn),通過擠壓后該點(diǎn)的高度y要變成和近平面一樣的y’
- 從側(cè)面看Frustum的話,如下圖,可以形成兩個相似三角形,即可得出y‘=(n/z)y
- 同理x'=(n/z)x

- 通過上面推導(dǎo)出來的兩個公式可得,對于任意一點(diǎn)(x,y,z,1)T 可得
這里為了方便書寫,用T來表示轉(zhuǎn)置矩陣,下文同

將這個點(diǎn)同時乘z得

(齊次坐標(biāo)同時乘k(k!=0),還得到相同的點(diǎn))
齊次坐標(biāo)的性質(zhì)的復(fù)習(xí)↓(詳解可見虎書150頁)

- 所以我們推導(dǎo)出了變化后的點(diǎn)的一部分
就是

- 那么一個矩陣乘以任意一點(diǎn)(x,y,z,1)T得到上圖,我們就可以推導(dǎo)出這個矩陣的一部分了
矩陣的一部分如下圖

想補(bǔ)全這個矩陣,需要用到兩條已知的性質(zhì)
- 近平面的點(diǎn)不會發(fā)生變化
- 遠(yuǎn)平面的點(diǎn)z的值不會發(fā)生變化

- 對于近平面上的點(diǎn)來說,他的z值就是n
見下圖

由性質(zhì)1可得
對于近平面上的點(diǎn)(x,y,n,1)T經(jīng)過矩陣變換后該點(diǎn)還為(x,y,n,1)T,同時乘n后得(nx,ny,n2,n)T
所以當(dāng)z等于n時,也就是說近平面的點(diǎn)通過矩陣運(yùn)算后變?yōu)?nx,ny,n2,n)T

所以矩陣第三行乘以(x,y,n,1)T= n2
可得第三行前兩個數(shù)一定為0,即(0,0,A,B)

可得
- An+B=n2
由性質(zhì)2可得
選一遠(yuǎn)平面上的點(diǎn)x=0,y=0,即中間點(diǎn)(0,0,f,1)T,經(jīng)矩陣變化后還是中間點(diǎn)(0,0,f,1)T,同時乘f后得(0,0,f2,f)T
即(0,0,A,B)(0,0,f,1)T=(0,0,f2,f)T
可得
2.Af+B=f2
聯(lián)立1、2得
A=n+f
B=-nf
至此可解出Mpersp -> ortho

所以對于空間中任意一點(diǎn)進(jìn)行透視變換可以通過如下公式解出

關(guān)于任意一點(diǎn)擠壓后向哪里移動的問題,簡單推導(dǎo)了一下

---------------------------------------------------------------------------------
Lecture5 光柵化
在進(jìn)行了上節(jié)課的操作之后,所有物體都處在了[-1,1]3的立方體中,接下來就要把他畫在屏幕上,這一步就叫做光柵化
在做透視投影時候需要將一個四棱梯擠壓成正方體,就需要先定義一個視錐(四棱錐)
那么如何定義視錐呢?

從攝像機(jī)看向一個地方,我們把它當(dāng)作近平面,寬和高是可以定義的,所以寬高比就是可以定義的
- 寬高比 Aspect ratio
- 可視角度 FOV (垂直角度和水平角度可以互相轉(zhuǎn)換)
通過以上兩點(diǎn)即可定義一個視錐

要把圖像投影到屏幕上就需要先定義屏幕,在圖形學(xué)中,屏幕就認(rèn)為是一個裝了像素的二維數(shù)組。如數(shù)組大小1920*1080
像素是最小單位,每個像素由RBG構(gòu)成
屏幕空間
屏幕坐標(biāo)系如下圖

像素的坐標(biāo)以左下角為準(zhǔn),如圖中藍(lán)色像素坐標(biāo)為(2,1)
像素的中心為(x+0.5,y+0.5)
繼續(xù)上節(jié)課的話題
如何將[-1,1]3中的東西顯示到屏幕上呢?

- 暫時忽略z
- 如果只將[-1,1]2中的東西顯示到[0,width] x [0,height],那么就很簡單了
做個縮放并平移就可以,這個變換就被稱為視口變換

隔行掃描
老師提到的一個有意思的知識點(diǎn)

以前的顯示設(shè)備要成像,都是在屏幕上畫很多線,畫滿整個屏幕就形成了一幀畫面
隔行掃描就是說
在第一幀只畫1、3、5等奇數(shù)線
在第二幀只畫2、4、6等偶數(shù)線
利用人眼的視覺殘留特性,這樣人們即發(fā)現(xiàn)不了畫面的異常,還能使機(jī)器工作量減半
如今還有某些視頻壓縮技術(shù)采用了這個思想
(但是隔行掃描會造成嚴(yán)重的畫面撕裂,特別是對高速運(yùn)動的畫面來說)
現(xiàn)代的一些顯示設(shè)備介紹
三角形

為什么光柵化選擇了三角形?
- 三角形是最基本的多邊形,沒有比三角形邊更少的多邊形
- 其他多邊形都可以拆分為三角形
- 三角形必定在一個平面內(nèi)
- 容易定義三角形的里外
- 三角形的三個點(diǎn)定義好后,三角形內(nèi)任意一點(diǎn)可以通過線性的插值來計(jì)算得到(重心坐標(biāo)的插值方法)
如:定義好三個點(diǎn)的顏色,三角形內(nèi)任意一點(diǎn)的顏色可以通過三個點(diǎn)的顏色來進(jìn)行插值計(jì)算得到
如何將三角形轉(zhuǎn)化為一個一個的像素?

簡單近似采樣
給定一個連續(xù)的函數(shù)f(x),當(dāng)x等于1時得到的f(1)就是1的采樣
所以采樣就是把一個函數(shù)離散化的過程
只要有一個定義在屏幕空間的函數(shù),那么我們就能算出來不同像素中心的值是多少
我們要采樣的東西就是
給定一個三角形,在像素的中心進(jìn)行采樣,來判斷中心是否落在三角形內(nèi)

逐像素遍歷,判斷該像素中心是否在三角形內(nèi)部,輸出到屏幕顯示
(至于如何判斷點(diǎn)在三角形內(nèi)部,前面的課程也講過請看Lecture2)

但是遍歷所有像素開銷太大,如下圖中白色那一列的像素根本沒有碰到三角形,所以只要遍歷藍(lán)色區(qū)域就可以了
我們知道三角形三個頂點(diǎn)的坐標(biāo),有了Xmin,Ymin,Xmax,Ymax就可以得到藍(lán)色的區(qū)域
藍(lán)色區(qū)域就叫做包圍盒(軸向包圍盒/BoundingBox/AABB)

采樣完成后,因?yàn)槊總€像素都是最小單位,像素內(nèi)的顏色必須一樣,所以我們會得到這樣一副圖

這看起來和初始的三角形差別很大,有一個個的明顯鋸齒(Jaggies/Aliasing)
下節(jié)課就會學(xué)習(xí)圖形學(xué)中的重大技術(shù),反走樣aka抗鋸齒!
---------------------------------------------------------------------------------------------------------------------------------
Lecture6 反走樣&深度緩沖
采樣理論
把到達(dá)光學(xué)元件上的光,產(chǎn)生的信息,離散成了像素,對這些像素采樣,形成了照片
采樣不只發(fā)生在位置上還能發(fā)生在時間上,對圖像在時間上進(jìn)行采樣,形成了視頻
采樣產(chǎn)生的問題
- 走樣
- 摩爾紋
- 車輪效應(yīng)
原因就是信號的變化太快了,以至于采樣的速度跟不上
反走樣處理方法:采樣前模糊

不能先采樣再模糊!只能先模糊在采樣
頻域、時域
頻域和時域是對信號或系統(tǒng)的兩種不同的表示方式。
頻域表示是通過分析信號的頻率分布來表示信號的方式。在頻域中,信號被分解為一系列不同頻率的分量,每個分量對應(yīng)著信號中的一種特定的周期性成分。
時域表示是通過直接分析信號在時間上的變化情況來表示信號的方式。在時域中,信號的變化被直接表示為在時間上的變化,而不是在頻率上的變化。

傅里葉級數(shù)展開
任何一個周期性的函數(shù)都可以變成一系列正弦/余弦的線性組合和一個常數(shù)項(xiàng)

傅里葉變換
可以把一個函數(shù)f(x)通過變化變成F(w),F(xiàn)(w)還能通過逆變換變成f(x)

對五個不同頻率的函數(shù)波形進(jìn)行采樣
通過f1(x)、f2(x)的采樣點(diǎn),我們可以大致還原出f1(x)\f2(x)的函數(shù)波形
但是從f3(x)開始,還原出的波形和原來的函數(shù)有較大出入,越往下越明顯
這里就可以理解什么叫采樣的頻率跟不上信號變化的頻率了

我們對藍(lán)色函數(shù)進(jìn)行采樣,得到黑色的函數(shù)
但假如原本就有這樣一個黑色的函數(shù)
我們同時對藍(lán)色和黑色進(jìn)行采樣,兩個截然不同的函數(shù),得到的采樣結(jié)果完全相同
這就被稱為走樣(Aliases)

濾波
濾波就是抹掉一些特定的頻率
對應(yīng)的信號如何發(fā)生變化
傅里葉變換可以把一個函數(shù)從時域變到頻域
右邊的圖像就是左邊的照片通過傅里葉變換得到的
右邊圖像表示的就是有多少信息
中間部分是低頻信息,越往外越高頻

高通濾波
在頻域空間內(nèi)完全抹掉低頻信號,將結(jié)果還原成圖像,形成左圖
高頻的東西在圖像上表示的就是圖像的邊界
為什么高頻信息代表著邊界?
當(dāng)某一圖像的周圍突然發(fā)生發(fā)生了變化,我們就認(rèn)為他是邊界
比如圖中人物的衣服和背景就是由黑色突然變成了灰色
相當(dāng)于顏色信號突然從黑色變成了灰色,就是出現(xiàn)了高頻的變化,即邊界

低通濾波
同理高通濾波,得到模糊的圖像

去除高頻和低頻,只留一部分


卷積
移動窗口(Filter),將窗口中三個數(shù)和覆蓋信號的三個數(shù)做點(diǎn)乘,填到結(jié)果中


其實(shí)就是信號在任意一個地方,在他的周圍做了個平均操作
卷積的一些定理
時域的卷積 == 頻域的乘積
- 可以拿到一幅圖直接用一個卷積濾波器進(jìn)行卷積操作
- 也可以
1.先傅里葉變換這幅圖,將這幅圖變到頻域
2.將卷積濾波器變到頻域上
3.將兩者相乘,乘完后得到的頻域的結(jié)果,將其逆傅里葉變換,變到時域上

將3*3的濾波器乘1/9是為了不讓圖像整體的顏色發(fā)生變化
如果不乘1/9,那么每個像素就會是原來這個像素周圍九個像素的和,圖像就會越濾波越明亮了

時域中的圖像的變化會對頻域產(chǎn)生什么樣的影響?
什么是采樣,什么是走樣

左邊一列是時域,右邊一列是頻域
對a圖像進(jìn)行c的采樣,得到e
對應(yīng)的操作在頻域中就是bdf
時域的采樣在頻域中就就體現(xiàn)為頻域信號的復(fù)制
(這里老師說左邊時域進(jìn)行乘積=右邊頻域的卷積,和前文說的不一致,我去查了一下,好像兩種說法是相互的,都可以,這里不太懂,但是不影響整體的理解)
為什么會產(chǎn)生走樣呢?
采樣不同的間隔,會引起頻譜不同間隔進(jìn)行復(fù)制,所相交的部分就是走樣

反走樣
先對圖像做模糊(把高頻信息拿掉),再采樣

把高頻信息砍掉,砍掉虛線方塊以外,在以原始采樣頻率進(jìn)行采樣
這樣頻域圖像就不會發(fā)生混疊,也就沒有走樣了

對覆蓋面積求平均,也就是卷積

MSAA(Multisample Anti-Aliasing)多重采樣抗鋸齒
通過更多的樣本來近似三角形的覆蓋率,并不是提高采樣頻率
把一個像素劃分為幾個小點(diǎn),判斷這些小點(diǎn)是否在三角形內(nèi),再把結(jié)果平均起來,就知道三角形覆蓋了這個像素的百分之多少



并不是簡單的提高了采樣的頻率,只是用來做第一步模糊,求三角形的覆蓋率,平均之后是什么
MSAA解決的其實(shí)是對信號的模糊操作
在工業(yè)界并不是直接將每個像素平均分了四份,而是采用了一些獨(dú)特的圖形,而且一些邊緣的像素還會被復(fù)用

關(guān)于FXAA可以去看一下Games104,里面講的比較詳細(xì)
https://www.bilibili.com/video/BV1kY411P7QM?t=2202.2
?