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

1. 旋轉(zhuǎn)矩陣:通過特殊點(0,1)和(1,0)構造旋轉(zhuǎn)結果可以得到
2. 平移矩陣:為了所有的變換都能寫成矩陣乘向量的形式,需要引入齊次坐標(變成三維矩陣)——這是一個tradeoff,后續(xù)要關注下引入齊次坐標會帶來什么問題
3. 齊次坐標表征:二維點(x,y,1),二維向量(x,y,0)——這樣保證了點與向量之間的加減操作的有意義性
4. 逆變換:矩陣的逆
5. 組合變換:矩陣乘法,注意矩陣相乘的順序
6. 齊次坐標表示是先變換再平移
1. 三維中的旋轉(zhuǎn):需要確定是左手坐標系還是右手坐標系,右手坐標系的坐標順序是XYZXY...Z軸指向屏幕外;左手坐標系是XZYXZ...Z軸指向屏幕內(nèi);由于循環(huán)對稱的特性,假設用的是右手坐標系,那么繞Y軸的旋轉(zhuǎn)是從Z轉(zhuǎn)向X的方向,所以其旋轉(zhuǎn)矩陣與繞X/Z軸的旋轉(zhuǎn)矩陣會有所不同
2. Rodrigue's Rotation Formula: 可以給出(在原點)繞一個軸旋轉(zhuǎn)任意角度的旋轉(zhuǎn)公式
3. 四元數(shù):聽老師意思是為了解決旋轉(zhuǎn)矩陣之間的加減?感覺有點類似引入齊次坐標的原因?
4. (右手坐標系的)相機坐標系:相機放在原點,看向-Z,向上是Y,然后把所有物體移到相機坐標系下——先平移到原點,然后把物體的坐標軸旋轉(zhuǎn)與相機坐標系對齊——這個對齊的旋轉(zhuǎn)矩陣不好直接寫,可以先寫逆變換,再取逆(其實就是轉(zhuǎn)置)
5. 正交投影:把中心平移到原點,然后縮放成標準立方體;如果用右手坐標系,因為看向-Z,那會導致近處平面的z坐標大于遠處平面的z坐標
6. 透視投影:把錐臺先擠壓成一個立方體,再做正交投影——第一步里,關于XY坐標,可以通過相似三角形去推導,而Z坐標需要和特殊點(0,0,f,1)聯(lián)立方程組去求解
- 怎么定義視錐?如果直接把所有坐標都指定好了,那當然最直接;不過更常用的定義是通過長寬比aspect ratio和垂直可視角度vertical field of view(fovY)來定義
- 光柵化:就是把物體畫到屏幕上——先將透視投影變換成標準立方體后,再將標準立方體變換到屏幕空間[0, width]*[0, height](通過平移與拉伸變換即可)
- 逐行掃描progressive scan vs. 隔行掃描interlaced scan:隔行掃描就是利用人眼的暫留現(xiàn)象,一幀只顯示偶數(shù)行,一幀只顯示奇數(shù)行
- 液晶顯示器LCD:通過液晶的扭曲影響光的偏振?(聽君一席話如聽一席話。。。)
- 為什么常用三角形光柵化?三角形是最基礎的多邊形,并具有一些良好性質(zhì):三角形內(nèi)部一定是一個平面(四邊形往對角線一折就不是了);點是否在三角形的內(nèi)部是well-defined的(向量的叉積);三角形內(nèi)的點很容易插值(barycentric interpolation)
- 怎么把三角形變成像素?最簡單的辦法就是采樣——判斷像素的中心點是否在三角形內(nèi)——點與所有任意兩個頂點(頂點按順/逆時針排序)構成的向量叉積同號
- 實際上像素不一定是內(nèi)部顏色均勻的方塊;RGB的密度也不一定一樣,比如可以放多點綠色感光單元,可以讓人眼看起來更舒服點
- 采樣造成的artifacts:如Jaggies/劇齒、Moire Patterns/摩爾紋、Wagon Wheel Illusion/車輪效應、etc.
- 從傅立葉變換的角度來解釋為什么采樣會造成失真:傅立葉變換可以把圖像分解成不同頻率的波的組合,低頻波對應圖像的內(nèi)容,高頻波對應圖像內(nèi)容的邊緣/edge,而要盡可能完全表示高頻波,需要的采樣率是遠遠高于低頻波的
- 卷積定理:空域的卷積等價于頻域的相乘
- 怎么保真
- SSAA/Super Sampling Anti-Aliasing: 在每個像素中進行多次采樣,然后根據(jù)多次采樣的結果綜合來計算像素的顏色值,比如説有4個采樣點,那該像素的顏色就是這4個采樣點的顏色平均
- MSAA/MultiSampling AA:類似于SSAA,在光柵化階段,判斷一個三角形是否被像素覆蓋的時候會計算多個覆蓋樣本(Coverage sample),但是與SSAA的差別在于,在pixel shader著色階段計算像素顏色的時候每個像素還是只計算一次,比如説4個采樣點只有兩個被三角形覆蓋了,那該像素點的顏色等于中心點的顏色*50%
- FXAA/Fast Approximate AA:后處理鋸齒圖,找到鋸齒的邊界,然后把這些鋸齒給替換掉
- TAA/Temporal AA:基于相鄰幀的信息
- 超分辨率
光柵化后就開始考慮怎么著色,著色需要先考慮物體之間的遮擋關系,再是考慮光照,最后看現(xiàn)代的圖形學管線是怎么處理這個過程的
- 處理遮擋的算法:Z-Buffer
- 每個像素會存儲當前位置的最小深度值/z-value,以及顏色值
- 實際操作時,就是遍歷每個三角形的每個像素,如果其深度值比當前緩存的深度值小,就更新該像素當前的深度值與顏色值;否則不操作
- 著色(只考慮一個點)
- 定義:把材質(zhì)應用到物體上的過程
- 感光類型:高光/Specular hightlights、漫反射/Diffuse reflection、環(huán)境光/Ambient lighting
- 著色輸入:視角方向、平面法向量方向、光源方向、表面參數(shù)(顏色、亮度等)
- Blinn-Phong Reflectance Model:
- Lambert's cosine law: 物體表面接收到多強的光照與物體表面和光的角度有關
- Light Falloff:根據(jù)能量守恒,某個點的光的強度,在傳播到距離光源r的地方的強度是I/r^2(這里沒有考慮物體到觀察點之間的距離的能量損失,是正常的,后面會講到)
- Lambertain/Diffuse shading: 結合a和b,再考慮物體對光強的吸收率(漫反射系數(shù)),就得到了漫反射的物體表面明亮強度
- Blinn-Phong Reflectance Model:上一節(jié)講的只是漫反射項,這一節(jié)接著講高光和環(huán)境光
- 高光項:與漫反射不同,高光項依賴于觀察角度(鏡面反射);怎么衡量能不能看到高光呢——看半程向量(觀察角度與入射角度的平均)與法向量是否足夠接近;這樣高光項就是考慮這三項——高光系數(shù)、Light Falloff、以及半程向量與法向量之間的夾角大小
- 環(huán)境光項:假設任何點接收到的環(huán)境光是一樣的,這樣環(huán)境光項就只考慮物體本身材質(zhì)的環(huán)境光系數(shù)*環(huán)境光亮度常量
- 著色頻率/Shading Frequencies——影響著色的質(zhì)量,如果頂點/面的數(shù)目足夠多,那也不見得非得用逐像素
- Flat shading:每個三角形只著色一次,即三角形內(nèi)部的顏色值是一樣的
- Gouraud shading:每個三角形的頂點都做一次著色,三角形內(nèi)部的顏色通過頂點的顏色進行插值得到
- Phong shading:逐像素著色(非Blinn-Phong模型)
- 根據(jù)Blinn-Phong模型,著色時需要知道平面的法向量,那頂點的法向量怎么得到呢?使用頂點相鄰面的法向量的加權平均(根據(jù)面積加權);那平面內(nèi)的像素呢?基于頂點的法向量做Barycentric interpolation(后面會介紹)
- 圖形/實時渲染管線:三維的點渲染到屏幕上的過程
- Vertex Processing:頂點投影變換到屏幕上
- Triangle Processing:頂點構成三角形
- Rasterization:采樣,判斷像素點是否在三角形內(nèi)
- Fragment Processing:Z-Buffer可見性判斷
- Framebuffer Operations
- 著色發(fā)生在4.a和4.d;Shader其實就是一段代碼,計算每個頂點/像素的顏色
- 老師推薦了一個shader網(wǎng)址:https://www.shadertoy.com/view/ld3Gz2
- 最后自己mark下一個有關于圖像管線的學習資料:https://fgiesen.wordpress.com/2011/07/09/a-trip-through-the-graphics-pipeline-2011-index/
- Texture Mapping/紋理映射:怎么把紋理映射到一個個三角形上——需要把三角形的頂點與紋理的坐標之間做一個映射
- Barycentric Coordinates重心坐標
- 三角形平面內(nèi)的任意一個點的坐標,都可以由三角形的三個頂點坐標的線性組合得到,條件是頂點的線性權重系數(shù)之和為1,這三個系數(shù)就是重心坐標。當三個系數(shù)都非負時,這個點在三角形內(nèi)
- 如果已知一個點的坐標,怎么得到這個點的重心坐標呢?這個點把三角形劃分成三個小三角形,每個小三角形的面積占比構成重心坐標之一;有一個公式可以直接計算得到
- 這樣,我們就可以使用重心坐標來線性組合頂點的顏色等屬性值,來得到三角形內(nèi)的任意一個像素的顏色等屬性值
- 要注意,重心坐標不是projection invariant的——這在計算深度值時要注意——計算深度值應該基于原始三維空間的重心坐標來插值,而非投影后三角形的重心坐標
- Texture Magnification紋理放大
- texel/紋素:a pixel on a texture,當紋理的分辨率太低時,多個像素會對應到一個texel上,這樣就會有一些“小格子”,視覺效果就不好
- 可以用雙線性/Bilinear插值(利用周圍四個texel的屬性做兩次插值)、雙三次/Bicubic插值(周圍16個texel做三次插值)來優(yōu)化這種情況
- Texture Minification
- 如果紋理太大了呢?一個像素就會對應到多個texel,這時就需要做采樣。回想起之前,我們可以用supersampling的方法來做保真,但是在這種情況下,一個像素覆蓋的texel可能太多了,那計算復雜度會比較高;這里換個思路,不做采樣,給定一個區(qū)域,直接能得到這個區(qū)域的平均值——圖形學里有比較高效的range query算法來解決這個問題
- Mipmap就是用來解決這個問題的區(qū)間查詢算法,但是它只支持方形區(qū)域,而且是個近似算法;Mipmap其實就是把紋理變成一個圖像金字塔,預先計算遠端的紋理貼圖,以空間來換時間的做法:每一層是上一層大小的1/4,直到最后變成1,所以內(nèi)存會多占用1/3;另外,如果有個紋理無法準確的在某一層的Mipmap里找到,也可以通過相鄰兩層的結果,做一次雙線性過濾來得到(因為做了三次線性過濾,所以也叫三線性過濾)
- Mipmap的問題:雙線性過濾和三線性過濾在渲染時對不同坐標是同等對待的,也就是假設原始紋理是方形的,這對于非方形物體就容易造成overblur的問題;改進手段:Anisotropic Filtering/各向異性過濾——在構造圖像金字塔時,比如原來64*64的,現(xiàn)在不止存了32*32的,也存了64*32和32*64的,以供紋理過濾時選擇;更高級的做法還有EWA filtering(留坑)