【北航計算機圖形學筆記】完整版

0. 介紹

計算機圖形學: 使用數學算法將三維或二維圖像轉化爲計算機顯示器的柵格形式. Data–>Image

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FFyShkqt-1593676402391)(C:\Users\dreamer\AppData\Roaming\Typora\typora-user-images\1585298041484.png)]

主要研究內容: 渲染(光照模型), 建模(細分曲面, 掃描點雲), 動畫(物理真實感), 人機交互

1. 概論

計算機圖形系統:
圖像硬件系統: 圖像輸入輸出設備, 圖形計算設備.
圖像軟件系統: 圖形應用程序, 圖形支撐軟件.

圖像輸出設備:
顯示設備: CRT顯示器, 平板顯示器(等離子顯示器, 液晶顯示器)
硬拷貝設備: 打印機, 繪圖儀
3D顯示設備
除了,3D顯示設備, 都是光柵設備, 但硬拷貝設備不能刷新.

光柵的硬件表現: 幀緩存
連續儲存空間
儲存屏幕上像素的顏色值
可看作所有顯示設備的硬件接口

每個像素在幀緩存中1位的儲存容量成爲位面
不同位面的幀緩存展示的圖像不同

顏色模型:
面向用戶: HSV模型, HLS模型
面向設備: RGB模型, CMY模型, YIQ模型

圖形計算設備: 顯卡, GPU

輸入方式: 測量過程, 設備觸發器
輸入模式: 請求模式, 採樣模式, 事件模式

2. 計算機圖形系統

圖形軟件系統

針孔照相機模型 虛擬照相機模型

圖形繪製流水線:
頂點處理(座標變換, 頂點顏色值)->裁剪和圖元組裝(視域->裁剪, 頂點->圖元)–>光柵化(輸出片元)–>片元處理(紋理,透明化)

OpenGL, OpenGL ES, WebGL
圖元: 幾何圖元(點, 線段, 折線, 多邊形), 圖像圖元

3. 基本圖形學程序

空間:
標量場
向量空間(座標系, 原點): 標量-向量乘法, 向量-向量加法
仿射空間: 點點減法
歐氏空間: 內積和正交, 度量的變換(長度和角度)

凸性: 滿足下式, 爲凸的

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-KBDgSKo7-1593676402394)(C:\Users\dreamer\AppData\Roaming\Typora\typora-user-images\1585494950007.png)]

座標系在表示平移變換時,有困難,於是引入標架和齊次座標

標架: 空間的一個定點O,連同三個不共面的有序向量e1,e2,e3的全體,叫做空間中的一個標架,記做{O;e1,e2,e3}。如果e1,e2,e3都是單位向量,那麼{O;e1,e2,e3}就叫做笛卡兒標架。兩兩互相垂直的標架叫做笛卡兒直角標架。在一般情況下,{O;e1,e2,e3}叫做仿射標架。

三維空間中: 座標系變換(3x3)–>標架變換(4x4)

仿射變換: 組合的線性變換=變換的線性組合

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-qIKlvhCW-1593676402396)(C:\Users\dreamer\AppData\Roaming\Typora\typora-user-images\1585495359508.png)]

流水線的級聯 導致 變換的級聯

4. 幾何對象與變換

線性組合出各類變換

流水線:

COP投影中心, 透視投影
DOP投影方向, 平行投影(COP在無線遠處)

沒有COP,

平行投影: 正投影, 軸測投影, 斜投影
透視投影: 一點, 兩點, 三點透視. (消失點的個數)

模-視變換矩陣: 模型到COP視角的變換.

三種方法定位相機(相機外參)

OpenGL的透視投影:
利用視域指定視景體

透視投影和平行投影都可以轉換爲正投影, 方便流水線使用.
P=N(透視投影的規範化矩陣)S(縮放變換)H(錯切變換)

5. 觀察與投影

模型變換: 模型座標系變到世界座標系下
計算光照: 利用光照模型
觀察變換: 世界座標系變到相機座標系下
透視變換: 流水線進行

光照模型: 使2D圖像(幀緩存是2D的)看起來像3D
全局光照: 全局的能量平衡, 繪製方程(積分方程,很難計算)
簡化使用局部光照: 只考慮光源和表明的一次相互作用
光源模型: 照明函數II(參數: 三個位置, 兩個角度, 一個波長)
四類光源: 環境光(強度相同), 點光源(距離衰減), 聚光燈(發光強度衰減), 遠距離光源(平行光源)
反射模型
Phong反射模型(法向量n, 觀察向量v, 光源向量l, 反射向量r)
改進Phong模型, 加入半角向量h

理想物體: 鏡面反射表面, 漫反射表面, 半透明表面
實際物體是粗糙的: 表面反射, 微幾何體
實際物體可以簡化爲三種表面反射的集合, 使用BRDF(雙向反射分佈函數)

法向量在OpenGL中是狀態的一部分(已知的, 用戶確定)

明暗繪製:
均勻着色(每個多邊形內部顏色一致, 導致Mach帶, 側抑制)
平滑着色(多邊形內部雙線性插值顏色)
Phong着色(多邊形內部雙線性插值法向量,再用光照明公式計算顏色)

陰影: 局部光照模型需要補充陰影, 利用透視變換(投影)得到地面上的陰影區域.

6. 光照與明暗繪製

圖元裝配(連接圖元)->裁剪(去掉不可見信息)->透視除法(規範化設備座標系)->視口變換(投影到二維攝像機平面上)

二維裁剪

線段裁剪:
暴力求交點需要大量乘法計算
Cohen-Sutherland算法: 4位端點編碼(確定點的方位), 分類討論(4種), 減少除法
Liang-Barsky算法: 與四條邊界直線相交, 看交點順序. 用減法替代大部分除法

多邊形裁剪:
Sutherland-Hodgman算法: 利用四個邊界的延長線依次裁剪(每次判斷多邊形所有邊, 更新點集), 問題: 可能會產生兩個以上個圖像,中間連接部分重疊(不獨立). 方便用於流水線結構
Weiler-Atherton算法: 規定邊爲矢量, 有出點和入點, 產生多個獨立圖像.

包圍盒和包圍體

曲線和曲面的裁剪

三維裁剪

二維算法都可擴展, Cohen-Sutherland算法變爲6位, 其他算法加邊界

視景體裁剪: 投影規範化後的正投影裁剪, 將三維任務簡化爲二維.

7.圖元裁剪

光柵化: 頂點->片元(點->格子)

本PPT講選取哪些頂點

片元Fragment: 顏色屬性, 位置屬性, 深度信息

直線光柵化:
DDA算法: 利用端點確定斜率m(0,1)(m>1,xy)m \in (0, 1)(m>1, 交換xy), 計算x,y, 只用加法.
Bresenham算法(經典): 不用浮點計算. 一個片元到下一個片元只有兩種可能, 所有判斷更接近那個就行.

圓光柵化: 使用平方/開方/三角函數(極座標)都很慢. 利用對稱性先畫第一象限, 這一步用中點畫圓法(兩個Bresenham算法), 然後對稱得出.

橢圓光柵化: 同樣利用對稱性先畫第一象限, 用中點()畫圓法

多邊形光柵化(填充):
內外測試
奇偶測試法: 點發出射線,計算與多邊形的交點個數(奇內偶外) 但對於自交多邊形\剛好通過頂點無效
環繞測試法: 先定義多邊形爲矢量, 再點發出射線, 交點的多邊形矢量方向從左至右+1(反之-1), 環數不爲0在內部.https://blog.csdn.net/freshForIphone/article/details/8273023
掃描線填充算法:
求交(類似DDA),排序,配對(兩兩配對),填充
處理奇點(掃描線與多邊形頂點相交): 令頂點爲非整數.
種子填充算法: 4連通/8連通, 遞歸太廢空間, 沿掃描線填充

走樣: 離散化引起鋸齒狀邊緣. 區域平均反走樣技術(將Bresenham算法中的比例作爲着色的權重).

8. 光柵化

隱藏面消除/可見面判定

對象空間算法: 適用於重疊少
遍歷O(N^2)不可取.
畫家算法: 先畫底層(遠景), 再畫近景. 重疊測試(觀察平面,深度)->調換順序(避免死循環)
BSP樹算法: 用平面不斷在深度上分割物體集合, 建立樹

圖像空間算法: 適用於重疊多
遍歷COP發出的k條光線, O(k), 性能可以但精度受幀緩存限制
Z-Buffer算法: 逐個物體計算, 雙緩存(深度+顏色)更近的就更新, 計算量小, 可同時處理正投影變換+隱藏面消除+明暗處理, 但精度不足, 不能處理透明表面(不同深度的顏色混合).
A緩存算法: 深度域和強度域(用鏈表將所有深度的顏色都保存)
掃描線算法: 標記ON(可見)/OFF(不可見), 重疊時才計算深度值. 但不能處理循環遮擋\表面相交(可以分割物體解決這兩個問題)

9~10. 隱藏面消除,紋理映射與片元處理

紋理映射+片元處理

幀緩衝的寫操作: 以位塊爲單位, 位塊傳送/光柵操作(源緩存->目標緩存)
寫入模式: 16種模式(保持不變\替換\按位與\按位或\等等)

映射(不用複雜模型)
紋理映射:
一系列紋理映射: 屏幕座標, 對象座標, 紋理座標, 參數座標
線性紋理映射方法
兩步映射方法
紋理->簡單三維中間表面(圓柱\圓等), 中間表面->對象表面
三種映射關係建立(中間表面的法向量\對象表面的法向量\對象中心的法向量)
面積平均法改善顏色走樣現象
OpenGL: 定義紋理對象, 給頂點設置紋理座標, 指定紋理參數, 設置紋理映射方式(調和\貼圖(顏色不變))
環境貼圖/映射:
兩步方法
鏡面中心繪製: 假裝照相機放在鏡子中心, 不需要計算所有光線及其反射. 中間表面: 球面映射/立方體映射. 但沒有實現鏡子本身的映射(比如光滑的水壺嘴)
常規繪製
凹凸映射:
法向量的擾動(幾何不變)

片元合成:
α\alpha 合成(1=完全不透明, 0=完全透明). 也可以實現反走樣, 多重採樣

11. 可編程流水線和GPU

之前講的是固定功能流水線: 參數控制, 各階段功能固定,

可編程流水線: 較少狀態變量, 某些階段仍然是固定功能, 代碼交複雜, 需要大量緩存對象.

頂點緩存對象VBO: 頂點數組對象VAO, 索引緩存對象EBO, 像素/紋理緩存對象PBO, 幀緩存對象FBO(實時渲染)/渲染緩存對象RBO(離線渲染)

着色器和着色語言:
實時渲染: OpenGL–GLSL, …
離線渲染: OSL, …
頂點着色器, 片元着色器, 細分着色器, 幾何着色器

GPU:
劃分多個GPC圖像處理簇, 其中劃分SM處理器, 其中劃分線程core核心
SIMD單指令多數據, (升級版)SIMT單指令多線程
統一着色器架構

12. 幾何建模

幾何建模
Geometric Modeling+幾何信息+拓撲信息
分爲顯式建模(點雲, 多邊形網格, 細分曲面) / 隱式建模(代數曲面, 體素表達, 水平集)

Geometric Modeling+幾何信息+拓撲信息

顯式建模(點雲, 多邊形網格, 細分曲面) / 隱式建模(代數曲面, 體素表達, 水平集)

線框模型: 頂點+棱邊, 簡單快速但不精確
邊界表達法(B-rep): 用一組曲面(二維)描述三維物體
點是最基本的信息;
邊是由兩點確定的;
環是由一組相鄰的邊組成的;
面是由封閉的環組成的;
體是由空間封閉面組成的。
解耦性好, 方便轉換爲線框模型(點+邊)
但是佔用空間大, B-rep表示不一定對應一個有效形體,通常運用歐拉操作來保證B-rep表示形體的有效性、正則性等。

三維流形: 在任意一點的附近一小片區域, 都是一個二維的一個面(a, b是, c不是, 附近區域不是一個面)

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-kyMJtWGF-1593676402398)(C:\Users\dreamer\AppData\Roaming\Typora\typora-user-images\1589645627173.png)]

多邊形網格
是邊界表達法的一種應用
使用半邊數據結構簡化儲存

代數曲面過於複雜
體素構造表示法 (CSG)
複雜物體可由簡單形體(體素: 提前定義好的集合),經過布爾運算後得到
實體表示爲一顆CSG樹的二叉樹, 其葉結點爲基本體素或幾何變換參數; 中間結點爲布爾運算或幾何變換操作
局部修改困難, 不具備面,環,邊, 點的拓撲信息

距離函數: 利於描述動態融合過程

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-gYtmpoKe-1593676402399)(C:\Users\dreamer\AppData\Roaming\Typora\typora-user-images\1589646801610.png)]

水平集: 高維空間描述低維空間

隱式模型的表面獲取
四/八叉樹
Marching Cube(MC)算法

隱式方法:
優點:
表達方式簡介
便於空間查詢
便於射線追蹤
簡單形狀無損失精度
便於表達拓撲變化(最明顯)
缺點:
複雜形體外形表達困難

邊界表達法: 用一組曲面(二維)描述三維物體

13. 曲線曲面

顯示形式: 依賴座標系
隱式形式: 難以求解
參數形式(特殊的顯示形式):
參數多項式曲線, 參數多項式曲面, 分段設計—利用三次參數多項式
得到曲線或曲面的三次參數多項式方法:
三次插值多項式
Hermite曲線和曲面 (控制點)
Bezier曲線和曲面 (控制點)
三次B樣條曲線和曲面 (控制點)
NURBS(非均勻有理B樣條曲線) (控制點)

多項式求值方法, Horner算法

14. 場景圖與圖形程序開發

場景圖

立即繪製, 利用率不高
批處理, 利用率高
批預處理, 比如多個一樣的圖形, 可以先將圖形預處理

OpenGL顯示列表: 一組預先儲存起來的待調用的OpenGL函數語句, 但無法支持動態數據
如: 矩陣操作, 光柵位圖和圖像, 光,材質和光照模型, 紋理和圖案填充

層級結構: 樹/有向無環圖(DAG) 如: 道路->車->車窗->玻璃

圖形程序開發

圖形程序開發平臺
OpenInventor/…
OpenSceneGraph(OSG)/OGRE/VTK/…
Three.js/Scene.js
Unity3D/Unreal/…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章