01 / 導讀
導讀
引用
Gambetta, G. (2021). Computer Graphics from Scratch: A Programmer's Introduction to 3D Rendering. No Starch Press. Free official edition: https://gabrielgambetta.com/computer-graphics-from-scratch/
章節概要
引言
引言把主題限定在計算機圖形學的一個分支:三維場景的渲染。Gambetta 曾在大學講授這門三年級課程五年,本書面向從高中生到專業工程師的讀者;對於每個業界標準演算法,他都選擇最容易理解的版本,同時避免含糊其辭。書中唯一假定的基本操作,是設定單個畫素顏色的函式。本書構建兩個渲染器——光線追蹤器和光柵化器——使用與具體語言無關的虛擬碼,並附有可執行的 JavaScript 演示連結;它有意不講 OpenGL、Vulkan、Metal 或 DirectX 等 API。
第1章:入門概念
這一短章定義畫布及其座標系、唯一的繪圖操作 PutPixel,以及顏色的表示方法:減色模型與加色模型、顏色深度,以及帶截斷的顏色縮放與相加等運算。最後介紹場景及其三維座標系,這是全書兩個部分共同的基礎。
第2章:基礎光線追蹤
第一部分從一個類比開始:透過固定的捕蟲網觀察風景,逐格照抄每個網格中看到的顏色來作畫。由此推匯出固定的相機和視口、從畫布畫素到視口點的映射、射線方程、球面方程,以及求兩者交點的二次方程。結果是第一個光線追蹤器,它把球體畫成純色的圓。
第3章:光照
光線追蹤器加入了光照。本章定義點光源、平行光和環境光,然後用漫反射(利用表面法線以及與光線的夾角)為啞光表面建模,用由鏡面指數控制的鏡面項為光亮表面建模,並把它們合成為完整的光照方程。球體由此顯得立體。
第4章:陰影與反射
物體之間開始相互影響。陰影的計算方法是從每個點向每個光源發射射線並檢查是否有遮擋;反射則通過遞迴追蹤反射射線來計算,並設定遞迴上限,以免在鏡面之間無限反彈。
第5章:擴充光線追蹤器
本章概述超出本書範圍的功能:可任意放置並旋轉的相機、效能技術(並行化、快取、陰影最佳化、空間資料結構、子取樣)、三角形等其他圖元、構造實體幾何、帶折射的透明效果以及超取樣。本章最後解釋了為什麼光線追蹤一直難以即時執行,從而引出第二部分。
第6章:直線
第二部分再次從空白畫布出發。本章用 PutPixel 開發繪製任意斜率線段的演算法,並引入 Interpolate 輔助函式,在整數步長上計算線性函式的值;作者強調本書後續各處都會用到這個函式。
第7章:填充三角形
在直線的基礎上,本章先繪製線框三角形,再繪製填充三角形:先對頂點排序,再把三角形看作一摞水平線段,其端點沿邊插值得到。
第8章:著色三角形
填充演算法被擴充為在三角形上插值一個強度值:先沿各邊,再沿每條水平線段插值,從而產生平滑的漸變。作者指出,同樣的方法可以插值任何在螢幕上線性變化的頂點屬性,後續章節正是利用了這一點。
第9章:透視投影
本書轉向三維,用相似三角形推導透視投影方程,考察其性質(直線投影后仍為直線),並投影立方體的頂點,以線框形式畫出立方體。本章留下兩個問題:幾何資料與投影程式碼混在一起,以及位於相機後方的點。
第10章:描述與渲染場景
這一長章把物體表示為由頂點和三角形組成的模型,在場景中放置同一模型的多個實例,並應用模型變換和相機變換,使相機可以移動。隨後引入齊次座標,把旋轉、縮放、平移、投影以及視口到畫布的映射都表示為矩陣,從而把一整串變換壓縮為少數幾次矩陣乘法。
第11章:裁剪
為了處理位於相機後方或視野之外的幾何體,本章定義由五個平面圍成的裁剪體,然後用包圍球裁剪整個物體,並通過計算線段與平面的交點來裁剪單個三角形,給出虛擬碼,並討論裁剪在渲染管線中的位置。
第12章:隱藏面消除
為了渲染實體,本章比較畫家演算法與深度緩衝,解釋為什麼緩衝區儲存的是 1/Z 而不是 Z,並加入背面剔除——用一個簡單的代數測試跳過背向相機的三角形。
第13章:著色
第3章的光照方程現在被應用到三角形上。本章區分光照與著色,並介紹速度與品質之間的三種折中:平面著色、Gouraud 著色(插值頂點光照)和 Phong 著色(插值法線並逐畫素計算光照)。
第14章:紋理
本章以一個木箱紋理為貫穿範例,把影像"畫"到三角形上。它說明在透視下簡單插值紋理座標為何會出錯,推匯出透視校正紋理映射,再用雙線性過濾、多級漸遠紋理(mipmap)和三線性過濾提高品質。
第15章:擴充光柵化器
最後一章概述更多技術:法線貼圖、環境貼圖,以及光柵化器中實現陰影的兩種方法——模板陰影(在模板緩衝中對陰影體計數)和陰影貼圖。
附錄:線性代數;後記
附錄以實用的方式介紹書中用到的點、向量、點積與叉積,以及矩陣及其乘法。後記建議了後續可以學習的主題,包括全域光照、基於物理的渲染、體素渲染和細節層次演算法。
核心概念
第1章:入門概念
- 畫布與
PutPixel:由畫素組成的矩形網格,以及設定單個畫素顏色這一唯一操作,其他一切都在此基礎上構建。 - 加色模型:把顏色表示為紅、綠、藍三種相加的強度,與螢幕發光的方式一致。
第2–5章:光線追蹤
- 射線與球體求交:把射線方程代入球面方程,得到一個二次方程,其根就是交點。
- 漫反射與鏡面反射:啞光表面按法線與光線之間的夾角散射光,光亮表面則在鏡面反射方向附近增加高光。
- 陰影射線與遞迴反射:向光源方向和反射方向追蹤額外的射線,以模擬物體之間的相互影響。
第6–8章:直線與三角形
- 線性插值(
Interpolate):計算線性函式等間距的取值,是光柵化器的主力工具。 - 掃描線填充三角形:把三角形畫成位於插值得到的邊界之間的一條條水平線段。
- 屬性插值:把任何逐頂點的值(強度、深度、紋理座標)在三角形上傳遞開。
第9–11章:投影、場景與裁剪
- 透視投影:除以深度,使遠處的點顯得更靠近視野中心。
- 齊次座標:增加第四個座標,使平移和投影也能像旋轉和縮放一樣寫成矩陣乘法。
- 裁剪體:由五個平面圍成、可以安全投影的區域;其外的幾何體被移除或切除。
第12–15章:可見性、著色與紋理
- 深度緩衝:逐畫素的記錄(此處記錄 1/Z),無論繪製順序如何都只保留最近的表面。
- Gouraud 著色與 Phong 著色:前者插值在頂點處計算的光照,後者插值法線並逐畫素計算光照。
- 透視校正紋理映射與多級漸遠紋理:在投影下正確插值紋理座標,並使用預先過濾的小尺寸紋理來避免失真。
評析
優點
- 真正從零開始。 本書只以
PutPixel為起點,從簡單的幾何中推匯出每一種技術,使讀者明白每個方程的來歷。透過捕蟲網作畫的類比讓光線追蹤的設定變得直觀。 - 兩個渲染器的對比。 為同一場景同時構建光線追蹤器和光柵化器,使本書能夠對比兩者的長處:陰影和遞迴反射在光線追蹤器中十分自然,而紋理和速度則是光柵化器的優勢。第13章明確沿用了第3章的光照模型。
- 與語言無關的虛擬碼和線上演示。 大多數章節都連結到可在瀏覽器中執行的 JavaScript 實現,讀者可以把自己的程式碼與參考實現對照,並看到每一步的視覺效果。
- 章節短小集中,總結清晰。 每章都以一段總結結束,說明構建了什麼、還剩下哪些侷限,使整體進度易於跟隨和複習。
局限
- 沒有練習題。 書中沒有習題,練習只能來自實現渲染器本身,因此教師需要自行佈置作業。
- 簡化的光照模型。 光照模型(環境光、漫反射、Phong 式鏡面反射)是經驗性的而非基於物理;全域光照和基於物理的渲染只在後記中被提及。
- 不涉及 GPU 和圖形 API。 本書有意不講 OpenGL、Vulkan、DirectX 或著色器程式設計,需要掌握實際即時圖形技能的學生必須另找資料。
- 進階主題僅作概述。 第5章和第15章以概覽形式介紹加速結構、折射、法線貼圖和陰影技術,沒有給出完整的演算法或分析。
在課程中的定位
在本課程的圖形學書單中,Gambetta 的書是渲染學習的起點;同為入門讀物的 Rogers、Sharp 和 Preece 的 Interaction Design 涵蓋的是課程中人機互動的一面,而非渲染。在閱讀 Marschner 和 Shirley 的 Fundamentals of Computer Graphics 或 Angel 和 Shreiner 的 Interactive Computer Graphics 之前,本書是很好的先導讀物;這兩本通常被認為是更完整的課程教材,後者講授 WebGL 程式設計,正是本書刻意跳過的 API 層面。
在進階學習方面,Real-Time Rendering(Akenine-Möller 等)把光柵化這一半延伸到現代 GPU 技術,Physically Based Rendering(Pharr、Jakob 和 Humphreys)則把光線追蹤這一半推進到基於物理的光傳輸——本書後記正是把這一主題列為下一步。已有圖形學基礎的學生可以快速瀏覽 Gambetta,或直接轉向更進階的教材。
如何使用本書
本書適合能用任何一種語言程式設計、並記得高中代數和少許三角函式的讀者;所需的線性代數在附錄中講解,如果不熟悉向量和矩陣,值得先讀附錄。
一個實用的方法是用自己選擇的語言親手實現每個渲染器,只借助某個庫或瀏覽器畫布來設定畫素,遇到效果不對時再與連結的演示對照。第一部分(第2–4章)幾次學習就能完成,並能很快看到影像效果;第5章是一份可選擴充的清單。第二部分(第6–14章)篇幅更長,第6–8章必須徹底理解,因為 Interpolate 和屬性插值是此後一切內容的基礎。第9–12章構成光柵化器的幾何核心;從第13–14章開始,畫面才變得逼真。第15章可以當作閱讀清單。
由於沒有練習題,自學的讀者可以自己設定任務:實現第5章和第15章中概述的擴充,例如在光線追蹤器中支援三角形、可移動的相機,或在光柵化器中實現陰影貼圖。
版本與來源
本導讀依據作者官方網站 https://gabrielgambetta.com/computer-graphics-from-scratch/ 上的免費線上版 Computer Graphics from Scratch,其內容即 2021 年 No Starch Press 出版的正文。內容取材於目錄、引言全文、每一章(全部小節標題、章節開頭和章末總結,並細讀了射線與球體求交、投影方程以及使用 1/Z 的深度緩衝等核心推導)、線性代數附錄和後記。
