Computer Graphics I: Rendering – Rasterization Vs. Ray Tracing

Computer Graphics 是 model 3D 的物體和運動。要能被人眼看到,有兩個要素:(1) 要有光線打光在 3D 的物體和空間呈現亮度和顏色。(2) 3D 物體的亮度和顏色要轉為 2D display 顯示。這個過程稱為 rendering (渲染).

(1) and (2) 的順序決定了兩種 rendering 的方式:rasterization or ray casting/tracing.

Ray casting/tracing: Ray Based Rendering (1->2)

Ray casting/tracing 的主體是 rays 如下圖。為了簡化,我們假設每一個 2D display pixel 對應 1 ray (1 pixel per ray or 1 ppr). 對於 720p (1280×720 ~ 1M pixel) display 代表 1M rays. 如下圖只考慮一個 3D object 和一個 light source, 每一條 1st ray 只需要考慮是否和 3D 球相交。如果相交,ray/surface normal 的角度和 light source/surface normal 的角度可以用於計算亮度 (e.g Lambertian illumination). 這個只計算 1st ray 方法稱為 ray casting.

注意 one ray 和一個 3D 球可能有 0/1/2 個交點,分別對應 不相交/擦邊切/穿過 三種情況。不相交對應的亮度就是黑色,一個交點的處理如上。兩個或是多個交點(one ray to one object or more objects) 的重點是找到最短時間 (minimum t, camera origin t=0) 的交點。

更進一步可以計算 2nd ray, 包含反射,折射,這稱為 ray tracing. 效果如下圖。注意看陰影,倒影都是 2nd or more ray 產生的效果。 Rasterization rendering 很難產生類似的真實效果。

Rasterization: Object Geometry Based Rendering (2->1)

第二種則是延續 object geometry 為主的思路如下圖。先把 3D object (in mesh form) 轉換到 2D 平面,再著色 (coloring and shading, i.e. fragment). Rendering 包含其中 rasterization (3D->2D) + fragment (coloring/shading based on depth).

Rasterization rendering 是目前 graphic processing 的主流 starting from Silicon Graphics Inc. (SGI) in 1981 (from Stanford). 因為上圖的 graphic processing 可以 pipeline 如下圖,每一級 pipeline 可以高度平行化。整個 graphic processing 適合用 VLSI 集成也造就 GPU 的傳奇 (SGI -> S3 -> Trident -> 3dfx -> ATI, Nvidia)。

SGI 另一個同樣重要的貢獻就是 OpenGL software. [@wikiSiliconGraphics2020]

非常有趣是 Computer Graphic 西岸重鎮 Stanford University, SGI/Trident/nVidia 如 Jim Clark, Pat Hanrahan. 相關課程包含 EE267 Virtue Reality, CS… 先教 rasterization, 再教 ray casting/tracing; 東岸的 MIT Computer Graphic (6.837) 卻是先教 ray casting/racing, 再教 rasterization.

工筆畫 (rasterization) 和印象派油畫 (ray tracing)

人類畫畫其實也是把 3D object 轉換成 2D 畫布渲染。
這裡用不同繪畫技巧來類比以上兩種不同的 rendering (渲染) 方法。

工筆畫 (rasterization)

Rasterization 就像國畫中的工筆畫。工筆,就是運用工整、細緻、縝密的技法來描繪對象。工筆又分為工筆白描和工筆重彩兩類。工筆白描就是完全用墨的線條來描繪對象,不塗顏色 (Rasterization)。白描本來大抵是用來打草稿的,宋代畫家李公麟把它發展成獨立的畫種,他的白描如行雲流水,變化無窮豐富,有很強的表現力。工筆重彩,就是指工整細密和敷設重色的中國畫。在中國繪畫的早期,工筆重彩占有主要的地位。湖南長沙馬王堆漢墓發現的帛畫、都是道地的工筆重彩,特別是軑妃墓的T形「非衣」,構圖巧妙,線描精細 (1. Rasterization),設色絢麗 (2. Fragment),顯示了當時工筆重彩達到了高度的成就。古代繪畫普遍使用丹砂和青綠之類的重彩顏料,因此稱繪畫為「丹青」,由此可見工筆重彩在古代繪畫中的重要地位了。

https://kknews.cc/culture/kxvna5p.html

印象派油畫 (ray casting/tracing)

印象派油畫,特別重視光影。下圖是莫內的睡蓮和拱橋,是我最喜歡的油畫,光和影是主角,物體本身倒不是這麼重要。光影點出 (ray casting) 後,睡蓮,拱橋,和柳樹以及倒影 (ray tracing) 就躍然紙上。並不像工筆畫先畫線條再上色。

  • 一個問題是 ray 和 pixel 並不一定一一對應:有一些 pixel 可能有多條 ray 通過,有一些 pixel 可能完全沒有 ray 通過。這會產生 "pop noise" (not white noise, high spatial frequency noise) on the 2D display. 上圖莫內的睡蓮近看可以看到很多 ”noise", 遠看則是傑作。
  • 下圖左是 computer ray tracing 的結果。如果沒有足夠多的 rays, 需要有 de-noise function removes "pop noise" 如下圖右。 實務可以使用 hybrid model, 也就是 rasterization + sparse ray tracing.

Q&A

Q: What is tessellation?
A: Triangulate 3D object into 3D mesh (如上圖的牛)

Q: What and where is Rendering?
A: Rendering is 3D object to 2D image. Two ways to do it: rasterization or ray tracing. "Rasterization + Fragment" = Rendering

Q: What is rasterization?
A: Convert the 3D triangle mesh to 2D fragment (with depth and who is on top, etc.) but no color or lighting information. That is the operation of Fragment.

Q: What is shader?
A: A shader is a type of program originally used for shading in 3D scenes. They now SW or specialized HW engine perform a variety of specialized function or post-processing unrelated to shading!

  • Vertex shaders (3D is vertex shader; 2D is pixel shader)
  • Geometry shaders
  • Tessellation shaders (triangle 3D object to 3D mesh)
  • Primitive and Mesh shader (convert 3D to 2D?) or done by ALU?
  • Fragment shader (lighting and coloring)

3D:
Step 1: Model 3D objects using (三角形) vertex.
Step 2: Vertex Shader
Step 3: Tessellation?
Step 4: Post processing
3D to 2D:
Step 5: Rasterization
2D:
Step 6: Fragment shader (rendering)

注意 vertex shader and fragment shader 可以用同一個 shader core in GPU 處理。讓 GPU utilization rate 可以提高。

Software to Hardware
Refer to Nvidia paper

Lighting

以現代(2000~) GPU 來說,是以 rasterization 為主。一直到 2015, ray tracing 才再度

有幾種方法呈現:

  • 先做 3D to 2D 的轉換 (rasterization), 根據物體在 3D 空間的關係,只需要計算最上層沒有遮擋的 voxel to pixel, 再來決定每一個 pixel 的亮度和顏色 (rendering)。這可以大量減少計算。但是有兩個問題:(a) 3D to 3D lost lots of information, 特別是光亮度的 information; (b) 如果物體是透明或半透明,很難呈現下層的 voxel effect.
  • 改成以 (dense) ray tracing 為主,我們只需要 trace view ray 的直射,反射,折射,和漫射,再 map to pixel. 這個過程很接近人眼的視覺,可以產生栩栩如生的效果。
  • Hybrid method

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Design a site like this with WordPress.com
Get started