Fundamentals of Computer Graphics(4th Ed)--Introduction(計算機圖形學翻譯級筆記)

轉載請註明出處
歡迎留言、討論、指正
本文未註明出處圖片均來自 個人 或 Fundamentals of Computer Graphics(4th Ed)

計算機圖形學–>使用計算機作圖改圖
涉及:特殊硬件、文件格式、圖形學API等
本書主要介紹合成圖像和三位物體或場景的基本算法和數學知識

圖形學內容(Graphics Area)
多數從業者認同以下核心領域
建模:將形狀和幾何特徵以某種方式數值化存儲於計算機中
           eg:咖啡杯=一個3D點集以某種插值規則連接+光線作用
渲染:繼承自藝術領域,負責將3D模型轉換輸出爲2D視覺圖片
動畫:通過建模和渲染輔以時間關鍵幀,專注於由圖像序列產生運動錯覺的技術
以下相關領域不一定是核心,但本書會接觸到:
用戶交互,虛擬現實,信息可視化,圖像處理,3D掃描

應用領域(Major Application)
遊戲動漫,視覺特效,計算機輔助設計CAD/製造CAM,仿真(尤其式安全領域),醫療圖像(CT)

圖形學API
一組相關操作的標準函數集合
一個圖形學程序=用戶界面API+視覺輸出API+…
有兩種主要範式:
1.整合型的,以JAVA爲例,有完整的可移植的標準工具包,視爲語言的一部分被充分支持
2.語言依賴型,如OpenGL、Direct3D,作爲軟件庫的一部分,系統間不一定兼容,使用移植庫
多數圖形調用相近,本書側重概念原理

管線(Graphic Pipeline)
如今的桌面電腦都擁有強大的3D管線,一種將3D基元(點座標或者線段)處理成圖像的特殊軟/硬件子系統,通常針對共頂點的三角形網格進行了優化,最基本的操作便是將3D頂點轉換到2D視覺圖中相應座標上同時考慮遮擋(現在多采用Z-buffer這種暴力的方式處理遮擋)。

管道使用四維座標,即幾何三維+透視同質座標(fourth homogeneous coordinate that helps with perspective viewing),4D-matrix + 4D vector,可以完成幾乎全部的幾何操作。4D座標運算是計算機科學中最微妙(subtle和beatiful)的結構之一,也是學習過程中最大的挑戰。

因爲交互直接影響用戶體驗,運算速度多數時候比圖像質量更重要,所以最少化建模所需的三角形很有必要。遠"少"近"多",因此使細節可變(varying level of detail,LOD)很重要。

數學基礎(Numerical Issues)
現代計算機都統一在IEEE floating-point standard 的標準之下,極大的方便了programmer:

±\pm\infty00=\frac{0}{0}=NaN(Not a Number), a±=±0\frac{a}{\pm\infty}=\pm0
++=NaN\frac{+\infty}{+\infty}=NaN0=\frac{\infty}{0}=\infty=NaN\infty-\infty=NaN±a+0=±\frac{\pm a}{+0}=\pm\infty

例如求電阻或透鏡焦點,可以避免 “if(b ==0||c ==0)” 檢測,直接得到 “a=0”
a=11b+1c a=\frac{1}{\frac{1}{b}+\frac{1}{c}}
又或者a=f(x)=\infty or NaN,boolean運算將得到:>0\infty>0判斷爲true,NaN判斷爲false;

a=f(x);
if(a>0)
   do something;

效率
因爲內存速度遠慢於CPU,programmer應該更多的關注內存(memory)的訪問模式而不是減少操作次數(operation counts)。這個問題只能通過有限連貫的內存訪問進行優化
謹記:
1.Write the code in the most straightforward way possible. Compute intermediate results as needed on the fly rather than storing them.(形式簡潔)

2.Compile in optimized mode.(???)

3.Use whatever profiling tools exist to find critical bottlenecks.(找瓶頸)

4.Examine data structures to look for ways to improve locality. If possible, make data unit sizes match the cache/page size on the target architecture.(數據結構趨向局部性,一"頁"知秋)

5.If profiling reveals bottlenecks in numeric computations, examine the assembly code generated by the compiler for missed efficiencies. Rewrite source code to solve any problems you find.(編譯層面找瓶頸–>重構)

多數優化只會使代碼更難讀懂而沒有效果
注意現代計算機float不一定比int慢,任何優化都需要結合機器去實踐

設計編寫圖形程序

1.設計類
一個好的類或例程是關鍵,KISS(keep it simpe and stupid)原則

一些基本的類 操作與說明
vector2 形如(x,y),包括+,-,\cdot,×,*,/
vector3 形如(x,y,z),似vector2
hvector 見第七章
rgb 存儲RGB三分量
transform 4×4矩陣,留有location、direction、normal vecto的接口
image RGB像素的2D數組
其他 eg:intervals,orthonormal base、coordinate frames

2.float與double

float double
爲提高效率應當儘可能少的訪問內存或訪問連續區間 計算精度
優先考慮,適用於色彩計算,數據存儲用 適用於幾何計算,數據計算

單精度
雙精度
num=...+23+22+21+20+21+22+23+...num=...+2^3+2^2+2^1+2^0+2^{-1}+2^{-2}+2^{-3}+...
故二進制與十進制轉換基於×2\times2÷2\div2進行

3.Debugging
越老道的programmer使用的debugger越高級
概念性的錯誤往往耽誤最多的時間,因爲難以察覺
Debug的正確姿勢:

科學方法
用圖像試錯–>猜想錯誤的原因–>驗證
eg:多數人編寫光線追蹤(ray-tracing)時會遇到(隨機暗點的)“陰影痤瘡”問題,傳統調試方法根本無效,我們需要意識到,這是"影線"搞的鬼,“影線"碰撞在被遮蔽的物體上。我們可以看到暗點的顏色是背景的顏色,因此我們缺的是直射光,暗點物體被誤判成"被遮擋”。爲了驗證假設,我們關掉陰影檢測,測試結果證明陰影檢測錯誤。這就是利用的錯誤的思想。

錯誤圖像出
跳過猜測部分以後的計算,直接將猜測錯誤的數值放入圖像數組輸出,顏色rgb即代表(x,y,z),注意越界或溢出檢測。

Debugger
當科學方法看起來也很矛盾時,只能深入Debugger。由於處理圖像時,循環較多,一個點一個點的來不現實,而且輸入通常都很複雜,bug也通常發生在複雜輸入的情況下…這時設置一個“陷阱"就很重要。在單線程中運行,同一組隨機數情況下找出bug點,在疑似錯誤代碼段前添加僅在疑似錯誤條件下執行的斷點,使得運行停止在疑似錯誤段前,單步運行找出問題。你也可以使用assert斷言檢查。

數據可視化
例如光線追蹤的情況下畫出"光線樹",或者將採樣過的點”標記“出來。將程序內部的數據狀態能夠在優化程序的同時更好的理解代碼的行爲或意義。可以使用matlab或Gnuplot(一款數據可視化數學軟件)腳本輔助輸出數據。

本書編程風格參考
Effective C++ series(Meyers, 1995, 1997)
The Practice of Programming (Kernighan & Pike, 1999)
Extreme Programming(Beck & Andres, 2004)

轉載請註明出處!!!

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