請問光柵化與渲染這兩個術語的區別和聯繫是什麼?

以前沒在意這倆概念。

昨天跟同學說起光柵化,我下意識地說:「光柵化就是把圖形數據轉換成圖像。」

事後我突然想到這話怎麼這麼眼熟,我記得@Milo Yip 好像在某個問題里答過,大概意思是:把圖形數據轉換為圖像元素,我們管這個叫渲染。

所以,光柵化與渲染這兩個術語的區別和聯繫是什麼?


渲染(rendering)一詞應該來自視覺藝術和繪圖,意指通過深淺、色彩、紋理等的技巧去做視覺表現。這種傳統渲染現在較常用手工繪製(hand rendering)取代。

而計算機圖形中的渲染通常是指,使用計算機把一些數據處理,輸出成一種可以顯示的形式。

例如,一個字形(glyph)是由一些線段及曲線所組成,它可以輸出成光柵化圖像(raster image),用於輸出至屏幕(光柵形式的輸出設備)。我們通常說這是把字形渲染至屏幕上。這又稱為柵格圖(raster graphics)、點陣圖(bitmap)。

但光柵化並不是唯一的渲染輸出方式,例如我們可用割字機切割貼紙,這時候需要把字形的數據轉換為步進電機的信號,按字形的輪廓移動,從而切割出所需的部分。這通常稱為矢量輸出(vector graphics)。不過,很多時候,習慣上這種形式不會稱作「渲染」。

輸出成光柵化圖像時,通常有兩種方法。

第一種是我們常說的「光柵化(rasterization)」,意指把一些幾何圖元(geometry primitive)逐一光柵化,輸出覆蓋圖元面積的多個像素顏色,然後把這些像素顏色合併至圖像緩衝。這是現時 GPU 做實時渲染的主要方式。如 @Yubo Zhang 提出,狹義的「光柵化」(在 GPU 中稱為光柵化階段/rasterization stage)只是計算圖元的覆蓋信息和幾何屬性的插值,並不計算fragment的顏色。

第二種是對圖像中每個像素對虛擬環境的光線採樣(sampling),就如同數碼相機的感光單元對真實世界的光線採樣一樣。最常見的演算法就是光線追蹤、路徑追蹤,多用於離線渲染。


光柵化負責的是整個渲染過程中的幾何成像環節,把幾何圖元(點、線,面)投影到成像平面並確定哪些像素或採樣點被圖元覆蓋,但不包括渲染過程中的光照著色計算,光柵化和光照模型無關,也不局限於三角形(比如可以是細分曲面),光柵化一樣可以結合光子追蹤,輻射度等物理光照模型,可以做到完全能量守恆,另外也可以作為射線追蹤第一次幾何求交的代替品。遊戲中的實時渲染,和早期RenderMan的REYES渲染,都是應用光柵化的經典案例。


我認為渲染演算法分為兩個宗派:以物理真實光線運算為核心的演算法(包括光線追蹤,光子追蹤以及兩者的結合)以及以三角形光柵化為核心的演算法(諸如大量的實時圖形學渲染)。


只說最常見的三角形的光柵化,這是顯卡里一個硬體單元做的事情:

  • 輸入,一個三角形的三個頂點,(x0,y0,z0,w0) (x1,y1,z1,w1) (x2,y2,z2,w2)
  • 輸出,這個三角形會覆蓋屏幕上哪些像素,可以認為是 Point2d [ ]

你看,它多傻呀,什麼光照貼圖它都不懂的。


如果把渲染比作做菜, 那麼你起鍋擺盤就是光柵化。


理論數據轉換成物理數據的過程。理論上我們可以完美的描述一個三角形的數學特性。在屏幕上只能用方塊像素拼成一個看起來差不多的三角形。這個過程就是光柵化。


Generally:

光柵化:矢量圖/圖元到像素圖

Rasterisation 也可以作為一種渲染方法(顯卡將圖元變成 Fragment/Pixel),與 Raytracing(通常是離線渲染)相對。

2D 矢量圖渲染:本身也就只有光柵化的過程。


渲染(rendering)是對一個三維物體進行幾何描述並且將它輸出到屏幕,看到圖形的過程。


推薦閱讀:

如何評價蘋果在 WWDC 2017 更新的圖形 API Metal 2?
影視渲染和遊戲渲染的區別?
斐波那契數列 費馬螺旋 如何在AI畫出向日葵生長規律圖形?
遊戲里的萬人同屏是如何優化?
你如何看待 Google 推出的新圖形渲染技術 Seurat?

TAG:計算機圖形學 |