渲染

渲染（render，rendering）又稱渲染、繪製、算繪等，在電腦繪圖中，是指以軟體由模型生成圖像的過程。模型是用語言或者數據結構進行嚴格定義的三維物體或虛擬場景的描述，它包括幾何、視點、紋理、照明和陰影等資訊。圖像是數字圖像或者位圖圖像。彩現用於描述：計算影片編輯軟體中的效果，以生成最終影片的輸出過程。三維電腦圖形的預渲染（pre-rendering，offline rendering）或者實時渲染（real-time rendering，online rendering）的速度都非常慢。預渲染的計算強度很高，需要大量的伺服器運算完成，通常被用於電影製作；實時渲染經常用於三維影片遊戲，通常透過圖形處理器（GPU）完成這個過程。

渲染是三維電腦圖形學中的最重要的研究課題之一，並且在實踐領域它與其它技術密切相關。在圖形流水線中，渲染是最後一項重要步驟，通過它得到模型與動畫最終顯示效果。自從二十世紀七十年代以來，隨著電腦圖形的不斷複雜化，渲染也成為一項越來越重要的技術。渲染的應用領域包含：電腦與影片遊戲、模擬、電影或者電視特效以及可視化設計，每一種應用都是特性與技術的綜合考慮。作為產品來看，現在已經有各種不同的渲染工具產品，有些集成到更大的建模或者動畫包中，有些是獨立產品，有些是開放原始碼的產品。從內部來看，渲染工具都是根據各種學科理論，經過仔細設計的程序，其中有：光學、視覺感知、數學以及軟體開發。

## 使用

圖像初步建立（通常使用網格骨架構建，建模（3D modeling））之後，就要進行渲染了。渲染將會在上面添加位圖紋理或者程序紋理、照明、凸凹紋理映射以及相對於其它物體的位置。得到的結果就是消費者或者觀察者所能看到的完整圖像。

在製作電影動畫時，通常需要渲染多幅或多幀圖像，並在動畫製作程序中將它們串聯起來。大多數三維圖像編輯程序都能完成這項任務，如Blender、Maya或Cinema 4D等。

## 特性

渲染的圖像具有許多顯著的特性，因此渲染研究的領域主要集中在尋找高效模擬這些特性的方法。有些特性只與特定的演算法有關，而有些則與多個演算法相關。

- 明暗處理—表面顏色與亮度隨光照的變化
- 紋理映射—在表面生成細節的方法
- 凸凹紋理映射—在表面模擬小凸凹的方法
- 距離模糊—光照穿過不清澈的大氣時的模糊
- 陰影—阻擋光照的效果
- 柔和陰影—模擬光的衍射下的陰影
- 反射—鏡子或者非常光滑的反射
- 透明—固體明顯允許光線穿過
- 半透明—光線通過固體高度散射
- 折射—與透明相關的光線彎曲
- 間接照明—表面由其它表面反射的光照亮，而非光源直接照亮
- 焦散（caustics）—間接照明的一種形式，光滑物體反射的光線或者通過透明物體生成的聚焦光線在其它物體上形成照亮區域
- 景深—當物體在焦距物體前後太遠時出現模糊
- 運動模糊—由於物體高速運動或者照相機運動而導致的物體模糊
- 真實感渲染—看起來較像現實世界的三維渲染
- 非真實感渲染—用藝術風格渲染場景，使它看起來象油畫或者素描

## 技術

研究人員已經開發出了許多渲染演算法，這些演算法使得渲染軟體能夠使用多種不同的技術來生成最終的圖像。

對場景中的每一束光線進行跟蹤是不太現實的，這需要消耗大量的時間。如果沒有對採樣進行適當的約束，那麼即使只跟蹤一部分光線以生成圖像，也會需要大量的時間。

所以，大致可以分為四類的更加高效的光線傳輸模型技術就應運而生。第一類是柵格化，包括掃描線渲染，這種方法考慮場景中的物體並將它們投影一幅圖像，但是缺乏一些高級的視覺效果；第二類是光線投射，將場景從不同視角觀察，只根據幾何與反射強度的基本光學原理計算觀察到的圖像，也可能使用蒙特·卡羅方法減少人為噪聲；第三類是輻射著色，使用有限元分析方法模擬光線在表面的散射；第四類是光線跟蹤，類似於光線投射，但是使用了更加先進的光學模擬方法，並且通常使用蒙特·卡羅方法以實現更加真實的結果，但是這樣做的代價通常是速度的大幅度降低。

為了在可接受的成本範圍內實現優質的結果，大多數高級軟體會組合使用多種技術。

### 掃描線渲染與柵格化

圖像的高級表示需要包含與像素不同的元素，這些元素被稱為基元。在示意圖中，線段和曲線是基元；在圖形使用者界面中，窗口和按鈕是基元；在三維渲染中，三角形和空間多邊形是基元。

在像素到像素的渲染速度過慢以至於無法實現的任務中，基元到基元的實現方法就可能派上用場。在這種方法中，循環遍歷每個基元以確定它將影響圖像中的哪個像素，然後相應地修改那個像素。這種方法稱為柵格化，這是當今所有圖形卡都使用的渲染方法。

柵格化通常要比像素到像素的渲染速度快。首先，圖像中的大塊區域可能根本沒有基元，柵格化可以忽略這些區域，而像素到像素的渲染方法卻必須遍歷這些區域；其次，柵格化可以提高緩存一致性，並且可以利用圖像中同一個基元占據的像素通常是連續的這樣一個事實來減少冗餘操作。正因如此，柵格化通常是需要交互式渲染的場合選擇的一種方法，但是像素到像素的實現方法通常可以生成更高質量的圖像，同時由於沒有柵格化那麼多的前提條件，所以更加通用。

柵格化主要有兩種形式。第一種是對整個表面或基元進行渲染，同時將表面頂點全部進行渲染。第二種是通過簡單的顏色混合相鄰頂點來渲染位於頂點之間的表面上的像素。這種方法不需要使用複雜的紋理來實現圖像的連續性，因此已經取代了舊的柵格化方法。此外，由於簡單的紋理可以節省記憶體空間，所以即使圖形卡的濃淡效果處理功能已經很繁重，仍然可以得到較好的性能。舊的方法如果不使用複雜的紋理，就會在圖像逐個表面覆蓋紋理的時候形成塊狀效應，並且，由於像素之間沒有顏色漸變，所以表面看起來也並不光滑。在某些情況下，設計人員會在某些表面上使用柵格化的方法，而在另一些表面上，他們會根據這些表面相對於其它相交表面的角度使用其他的方法。這樣做既可以提高處理速度，又可以保證整體效果。

### 光線投射

光線投射主要應用於實時模擬場景，如三維電腦遊戲和動畫。在這些場合，細節的重要性較低，或是可以通過人為製造細節來提高計算效率。這種情況通常出現在需要生成多幀圖像的動畫中。如果不使用其它的技巧，這種方法得到的物體表面通常看起來比較扁平，類似經過光滑處理的物體的糙面。

建立的幾何模型從外部觀察點開始，逐點、逐線進行分析，類似從觀察點投射出光線。當光線與物體交叉時，可以用幾種不同的方法來計算交叉點的顏色。其中最簡單的方法是用交叉點處物體的顏色表示該點的實際顏色；也可以用紋理映射的方法來確定；另一種更加複雜的方法是僅僅根據照明因數變更顏色值，而無需考慮與模擬光源的關係。為了減少人為誤差，可以對多條相鄰方向的光線進行平均。

此外也可以對光的特性進行大致的模擬：簡單計算從物體到觀察點的光線。其他一些計算涉及到從光源到物體的入射角，以及根據光源的強度計算像素的亮度值。還有一些模擬使用輻射著色演算法繪製的照明結果，或者使用這兩種資訊的組合。

### 輻射著色

輻射著色是模擬反射光線如何反射到其它表面以及如何照亮周圍環境的方法。這種方法可以生成較為真實的濃淡效果，並且更加易於捕捉室內場景的環境光。一個經典的例子就是牆角處陰影的樣子。

這種模擬的光學基礎是特定物體表面某一點的漫反射的光線散布在在很大的方向範圍內並且會照亮周圍的環境。

各種模擬技術的複雜性可能會有所不同。許多渲染方法所用的輻射著色模型都非常原始，它們只是簡單地根據環境因數變化照亮整個場景。但是當高級的輻射著色與高質量的光線跟蹤演算法組合在一起使用的時候，它們能夠生成相當真實的圖像，尤其是對於室內場景更是這樣。

在高級的輻射著色模擬中，遞歸的有限元分析演算法不斷地將光線在模型表面之間來回反射，直到達到一定的遞歸條件為止。這樣一個表面的色彩就會影響其它相鄰表面的色彩，反之亦然。整個模型（有時也包括空白空間）的照明結果保存起來，在光線投射或者光線跟蹤模型中作為輸入使用。

由於這項技術的遞歸特性，所以對於複雜物體的模擬速度非常緩慢。一些先進的輻射著色計算方法可能只計算房間中從牆面、地板與房頂反射的環境光，而並不計算複雜物體反光對於輻射著色的影響，或者在輻射著色計算中使用使用同樣尺寸及紋理的簡單物體取代複雜物體。

如果場景中需要重排的輻射著色物體很少，那麼可以在多幀畫面中重複使用同樣的輻射著色數據，這樣就使得輻射著色一方面可以改進光線投射中的扁平效果，另外一方面每幀的渲染時間也不會受到很大的影響。

正因為如此，輻射著色已經成為領先的實時渲染方法，並且已經用於最近大量著名的長篇三維動畫電影從頭到尾的製作過程。

### 光線跟蹤

光線跟蹤是掃描線渲染和光線投射技術的延伸，它能夠有效處理複雜物體，並且可以用數學方法描述物體。與掃描線渲染和光線投射不同的是，光線跟蹤幾乎完全採用了蒙特·卡羅方法，蒙特·卡羅方法是一種基於從模型中隨機抽取一組採樣進行平均的技術。

在這種方法中，採樣是假想的從場景物體發出與觀察點相交的光線。在重點考慮陰影、折射與反射等需要複雜精確渲染的場合這種方法就可以派上用場。

在最終要求產品質量渲染效果的光線跟蹤中，通常每個像素都要多條光線，並且不僅僅跟蹤到第一次相交，而是需要按照「入射角等於反射角」這樣的光學定律以及更加高級的處理折射與粗糙表面反射的定律處理多次連續反射。

一旦光線遇到光源或者更可能出現的是光線反射次數已經達到設定的限制，那麼最終點的表面照明就通過上面的方法確定下來，並且經過多次反射發生的變化也可以用來估計在觀察點看到的亮度。每個採樣點、每個像素都要重複這個過程。

在有些場合中每個交點可能生成多條光線。

作為一種非常有效的方法，光線跟蹤的實時處理速度太慢，直到最近也沒有在任何要求質量的短片電影中獲得應用，儘管它已經開始在一些特殊效果要求的場合開始使用，如在需要高質量甚至是Photorealistic的腳本片斷的廣告中開始使用。

但是，降低不需要高質量細節部分的或者與光線跟蹤特性無關部分的計算量的努力已經使得光線跟蹤的應用更加廣泛。目前已經出現了一些至少已經處於原型階段硬體加速的光線跟蹤設備，在一些遊戲演示中也有實時軟體或者硬體光線跟蹤的應用。

## 優化

### 藝術家構建場景的時候所用的優化方法

由於所需計算量非常大，一項逐步進行的工作的細節渲染通常對應於當時工作的進度。因此，在建模的開始階段可以使用線框模型或者光線投射進行處理，即使是最終的目標結果是要使用輻射著色的光線跟蹤也可以這麼做。另外也經常只對一部分進行高質量的渲染，而對於當前工作無關緊要的部分剔除出去。

### 實時渲染中常用的優化方法

對於實時渲染，適當的做法是簡化一個或者多個共同的近似，需要將關鍵場景的參數調整到正確的值，並且要優化這些參數以獲得最佳效果。

另外還有些一些不太出名的渲染方法，如球諧函數。這些技術由於速度較慢、缺少實用性或者僅僅因為它們還不太完善所以不太出名，或許其中的某些技術能夠提供一些新的解決方案。

## 採樣與濾波

不管系統採用哪種渲染方法，都必須解決採樣問題。本質上來講，渲染過程試圖用有限數目的像素將圖像空間的連續函數表現成顏色。根據採樣定理的結論，掃描頻率必須是點速（dot rate）的兩倍，點速與圖像解析度成正比。用簡單的話來說就是圖像不能顯示小於一個像素的細節。

如果使用一個未經驗證的渲染演算法，那麼圖像函數中的高頻成分將會導致最終圖像中出現難看的混疊現象。混疊現象通常表現為鋸齒圖或者是可見像素柵格處的鋸齒邊。為了去除混疊現象，所有的渲染演算法如果想要生成好看的圖像的話都必須對圖像函數進行濾波以去除高頻成分，這個過程叫作抗混疊。

## 電影渲染

電影渲染通常在一個緊密相連的電腦組成的網路渲染集群（render farm）。

當今用於電影製作三維圖像描述發展水平代表是Pixar設計的RenderMan 場景描述語言。它與VRML這樣較簡單的三維文件格式或者是經過修改專門用於三維硬體加速的OpenGL以及DirectX等應用程式編程接口（Application programming interface）有所不同。

電影渲染軟體包括：

- Renderman
- Mental Ray（已停止開發）
- Brazil R/S
- LightWave（包括建模模塊）
- Cycles （內建於Blender,有Cinema 4D的外掛）
- V-Ray

## 理論基礎

真實感渲染的實現都是某種程度的物理仿真 —一些計算都是真實物理過程的模擬或抽象。

「基於物理」這個術語表示是使用在渲染領域之外也被廣泛接受的物理模型或者近似，在渲染領域逐漸建立起了相關的特殊技術。

這些物理基本概念都相當直白，但是卻難於以少數的計算，得到精確且完整的結果；一個非常優秀的演算法或者實現方法對於更加通用的渲染目的來說卻可能難以理解。為了滿足健壯、精確及實用的要求，實現方法都必須是多項不同技術的複雜組合。

渲染研究工作主要集中在科學模型的改進及其高效應用。

### 渲染方程

渲染方程是渲染中的一個核心理論概念，它是渲染不可感知方面的最抽象的正式表示，所有更加完善的演算法都可以看作這個方程特殊形式的解。

$$L_o(x, \vec w)= L_e(x, \vec w) + \int_\Omega f_r(x, \vec w', \vec w) L_i(x, \vec w') (\vec w' \cdot \vec n) d\vec w'$$

含義是：在一個特定的位置與方向，出射光Lo)是發射光Le與反射光之和。反射光是所有方向入射光之和Li乘以表面反射率及入射角。通過交叉點，這個方程將入射光與出射光聯繫在一起，它代表了場景中完整的光線傳輸即光線的所有運動。

### 雙向反射分布函數

雙向反射分布函數（BRDF）描述了一個光線與物體表面相互作用的簡單模型：

$$f_r(x, \vec w', \vec w) = \frac{dL_r(x, \vec w)}{L_i(x, \vec w')(\vec w' \cdot \vec n) d\vec w'}$$

光線相互作用通常用更加簡單的模型進行近似：漫反射與鏡面反射。這兩種都可以是雙向反射函數。

### 幾何光學

實際上渲染是完全關於光物理粒子性方面研究的技術，即幾何光學。將光在本質上看作跳動的光子這種簡化是合適的：在大多數場合下，光的波動性是可以忽略的，並且也非常難於模擬。著名的光波動現象有衍射，如CD以及DVD上的顏色，以及如LCD上看到的極化現象。如果這兩種類型的效果，通常對反射模型進行針對表現效果的調整。

### 視覺

儘管很少受到關注，但是對於人類視覺的理解對於渲染來說非常重要，這是因為圖像顯示與人類視覺都有一定的約束範圍。渲染工具幾乎可以模擬無限範圍的亮度與顏色，但是電影、顯示器等當今的顯示設備都不能處理這麼大的範圍，通常都需要壓縮甚至捨棄一部分資訊。人類視覺也有類似的限制，因此不需要為了真實感而使用很大範圍的圖像。視覺研究可以幫助解決將圖像用顯示器顯示的問題，以及建議渲染中使用哪些捷徑，一些細微的資訊是無法感知的。這個相關的主題是色調映射。

在渲染中使用的數學基礎有：線性代數、微積分、數值分析、數位訊號處理以及蒙特·卡羅方法。

## 重要思想出現的年代表

- 1970 掃描線演算法 (Bouknight, W. J. (1970). A procedure for generation of three-dimensional half-tone computer graphics presentations. Communications of the ACM)
- 1971 Gouraud shading (Gouraud, H. (1971). Computer display of curved surfaces. IEEE Transactions on Computers 20 (6), 623–629.)
- 1974 紋理映射 (Catmull, E. (1974). A subdivision algorithm for computer display of curved surfaces. PhD thesis, University of Utah.)
- 1974 深度緩衝 (Catmull, E. (1974). A subdivision algorithm for computer display of curved surfaces. PhD thesis)
- 1975 Phong shading (Phong, B-T. (1975). Illumination for computer generated pictures. Communications of the ACM 18 (6), 311–316.)
- 1976 環境映射（Blinn, J.F., Newell, M.E.（1976）. Texture and reflection in computer generated images. Communications of the ACM 19, 542–546.）
- 1977 陰影體 (Crow, F.C. (1977). Shadow algorithms for computer graphics. Computer Graphics（Proceedings of SIGGRAPH 1977）11 (2), 242–248.)
- 1978 陰影緩衝 (Williams, L. (1978). Casting curved shadows on curved surfaces. Computer Graphics（Proceedings of SIGGRAPH 1978）12 (3), 270–274.)
- 1978 凸凹紋理映射 (Blinn, J.F. (1978). Simulation of wrinkled surfaces. Computer Graphics（Proceedings of SIGGRAPH 1978）12 (3), 286–292.)
- 1980 BSP trees (Fuchs, H. Kedem, Z.M. Naylor, B.F. (1980). On visible surface generation by a priori tree structures. Computer Graphics（Proceedings of SIGGRAPH 1980）14 (3), 124–133.)
- 1980 光線跟蹤 (Whitted, T. (1980). An improved illumination model for shaded display. Communications of the ACM 23 (6), 343–349.)
- 1981 Cook shader (Cook, R.L. Torrance, K.E. (1981). A reflectance model for computer graphics. Computer Graphics（Proceedings of SIGGRAPH 1981）15 (3), 307–316.)
- 1983 Mipmaps (Williams, L. (1983). Pyramidal parametrics. Computer Graphics（Proceedings of SIGGRAPH 1983）17 (3), 1–11.)
- 1984 八叉樹光線跟蹤 (Glassner, A.S. (1984). Space subdivision for fast ray tracing. IEEE Computer Graphics & Applications 4 (10), 15–22.)
- 1984 Alpha compositing (Porter, T. Duff, T. (1984). Compositing digital images. Computer Graphics（Proceedings of SIGGRAPH 1984）18 (3), 253–259.)
- 1984 分布式光線跟蹤 (Cook, R.L. Porter, T. Carpenter, L. (1984). Distributed ray tracing. Computer Graphics（Proceedings of SIGGRAPH 1984）18 (3), 137–145.)
- 1984 輻射著色 (Goral, C. Torrance, K.E. Greenberg, D.P. Battaile, B. (1984). Modelling the interaction of light between diffuse surfaces. Computer Graphics（Proceedings of SIGGRAPH 1984）18 (3), 213–222.)
- 1985 半立方輻射著色 (Cohen, M.F. Greenberg, D.P. (1985). The hemi-cube: a radiosity solution for complex environments. Computer Graphics（Proceedings of SIGGRAPH 1985）19 (3), 31–40.)
- 1986 光源跟蹤 (Arvo, J. (1986). Backward ray tracing. SIGGRAPH 1986 Developments in Ray Tracing course notes)
- 1986 渲染方程 (Kajiya, J.T. (1986). The rendering equation. Computer Graphics（Proceedings of SIGGRAPH 1986）20 (4), 143–150.)
- 1987 Reyes algorithm (Cook, R.L. Carpenter, L. Catmull, E. (1987). The reyes image rendering architecture. Computer Graphics（Proceedings of SIGGRAPH 1987）21 (4), 95–102.)
- 1991 分級輻射著色 (Hanrahan, P. Salzman, D. Aupperle, L. (1991). A rapid hierarchical radiosity algorithm. Computer Graphics（Proceedings of SIGGRAPH 1991）25 (4), 197–206.)
- 1993 色調映射 (Tumblin, J. Rushmeier, H.E. (1993). Tone reproduction for realistic computer generated images. IEEE Computer Graphics & Applications 13 (6), 42–48.)
- 1993 Subsurface scattering (Hanrahan, P. Krueger, W. (1993). Reflection from layered surfaces due to subsurface scattering. Computer Graphics（Proceedings of SIGGRAPH 1993）27 , 165–174.)
- 1995 光子映射 (Jensen, H.J. Christensen, N.J. (1995). Photon maps in bidirectional monte carlo ray tracing of complex objects. Computers & Graphics 19 (2), 215–224.)

## 圖書資料

- Foley; Van Dam; Feiner; Hughes (1990). Computer Graphics: Principles And Practice. Addison Wesley. ISBN 0-201-12110-7.
- Glassner (1995). Principles Of Digital Image Synthesis. Morgan Kaufmann. ISBN 1-55860-276-3.
- Pharr; Humphreys (2004). Physically Based Rendering. Morgan Kaufmann. ISBN 0-12-553180-X.
- Dutre; Bala; Bekaert (2002). Advanced Global Illumination. AK Peters. ISBN 1-56881-177-2.
- Jensen (2001). Realistic Image Synthesis Using Photon Mapping. AK Peters. ISBN 1-56881-147-0.
- Shirley; Morley (2003). Realistic Ray Tracing (2nd ed.). AK Peters. ISBN 1-56881-198-5.
- Glassner (1989). An Introduction To Ray Tracing. Academic Press. ISBN 0-12-286160-4.
- Cohen; Wallace (1993). Radiosity and Realistic Image Synthesis. AP Professional. ISBN 0-12-178270-0.
- Akenine-Moller; Haines (2002). Real-time Rendering (2nd ed.). AK Peters. ISBN 1-56881-182-9.
- Gooch; Gooch (2001). Non-Photorealistic Rendering. AKPeters. ISBN 1-56881-133-0.
- Strothotte; Schlechtweg (2002). Non-Photorealistic Computer Graphics. Morgan Kaufmann. ISBN 1-55860-787-0.
- Blinn (1996). Jim Blinns Corner - A Trip Down The Graphics Pipeline. Morgan Kaufmann. ISBN 1-55860-387-5.
- Description of the 'Radiance' system