索引 / 001 ZH-TW
Computer Graphics from Scratch: A Programmer's Introduction to 3D Rendering(從零開始的電腦圖學:寫給程式設計師的 3D 算繪入門) cover

電腦科學

電腦科學

Computer Graphics from Scratch: A Programmer's Introduction to 3D Rendering(從零開始的電腦圖學:寫給程式設計師的 3D 算繪入門)

Gabriel Gambetta

英文原名: Computer Graphics from Scratch: A Programmer's Introduction to 3D Rendering

一本說明 3D 影像如何產生的簡短入門書,讀者將從基本原理出發寫出兩個算繪器:一個光線追蹤器與一個光柵化器。書中只以「替單一像素上色」的能力為起點,由基礎幾何推導出每種技術,並以虛擬碼說明,網路上另有互動式示範。

需要的基礎: 能以任一語言撰寫基本程式,具備高中代數與三角函數;所需的向量與矩陣數學整理在附錄中。

難度等級
入門
學術層次
大學部
computer graphics3d renderingraytracingrasterizationlinear algebra教科書

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 的深度緩衝等核心推導)、線性代數附錄和後記。