2011/07/05

Krakatoa的兩種算圖模式:Particle與Voxel

電影 X-Men 2利用Krakatoa算出來的效果

翻譯: Hammer Chen

Krakatoa是一套volumetric粒子渲染器, 也是第一個實現讓粒子以像素的大小來進行高速細節算圖的外掛. 但其實在Krakatoa推出以前, 有另外一種作法可以渲染粒子, 用在電影超人再起(Superman Returns)裡面. 在場景裡面粒子在水晶中必須要進行光跡追蹤計算, 光跡追蹤計算極小的點, 是一項極為困難的工作, 必須要利用特殊的作法---稱為voxel grid計算法. 新版的Krakatoa 1.5.0 把當時電影裡的作法重新呈現, 用voxel grid來計算粒子, 這個方法有其優缺點, 請看以下:


優點
  • Voxel Rendering會產生實體的渲染效果, 不會像一般的點雲渲染出來容易出現的錯誤(例如摩爾紋). 只需要用較少的數量就能產生密度很高的點雲, 只要在每個voxel至少有一顆粒子, 而算出來的結果voxel之間不會有縫隙.
  • 渲染的細節與平滑度可以用voxel size與filter半徑來控制, 可以得到和預設的point rendering相當品質的渲染效果. 然而, 當voxel size設定太高, filter半徑太大時, 容易計算出模糊的結果.
  • 跟Point Rendering 比較起來, voxel rendering的方法比較適合多核心運算, 讓你更能享受到多核心CPU的優勢.
缺點
  • 至少在目前的版本 通常voxel rendering要比particle rendering算圖時間要更久.
  • 儘管算圖品質與細節很接近 point rendering 還是沒辦法達到跟particle rendering那樣一顆一顆粒子的感覺, 因此voxel rendering還是比較適合用來渲染雲, 煙與其他細節較少的自然現象; 而particle rendering就適合表現細砂, 塵土與泥沙.
Particle 與 Voxel Rendering的比較
如上圖, 你看到同樣的幾合體利用Krakatoa PRT Volume object充滿了粒子 而Voxel Length為0.5, 1, 2 與 3 第一排影像顯示Particle Rendering的效果, 當粒子密度減少時, 粒子的間距就變寬鬆了

上圖中顯示利用Voxel Rendering的效果, 而Voxel Size分別為0.5, 1, 2與 3 Filter Radius設定為1 (1代表沒有filter)

這個範例裡 當算圖的細節減小時Voxel Rendering方法算出來的密度還是可以維持住, 只是說整體而言變得比較模糊的粒子雲. 以Particle方法算圖時間分別為10.938 | 1.484 | 0.547 | 0.454秒
以Voxel的算圖時間分別為6.109 | 3.734 | 1.829 | 1.422秒

Voxel Rendering的參數設置
以下範例渲染兩萬顆粒子, 用兩盞燈照明, 白色光源在右, 藍色光源在左下.

左圖與右圖的密度分別為5.0/-1, 5.0/0.
算圖時間都是0.2秒

改變Voxel Size
上面三張圖顯示用5.0/-1密度 Voxel Filter Radius為1 而Voxel Size分別為0.5, 1.0 與 5.0來渲染

當voxel size等於0.5時, 算出來的結果十分接近particle rendering的效果. 因為在這個範例裡面,voxels十分接近particle的算圖顆粒大小, 但是就算圖時間上缺要花費很久.

當把voxel size增大時, 結果變得很平滑 而算圖時間也變短了
算圖是用Dual-Quadcore Xeon 2.5GHz的CPU 算圖時間分別為6.641 | 4.953 | 2.843秒

改變出圖大小
Voxel Rendering跟Particle Rendering的效能不同, 出圖大小對算圖時間有很大影響

當解析度比超過一個像素時 Voxel Renderer就必須要多計算像素

以下是用Voxel Sizes分別為0.5, 1, 2 與 5計算的結果, 但是用不同的解析度出圖Krakatoa會用接近線性的方式縮放. 實際上, 因為多核心計算的關係, 儘管解析度增大讓圖面積增加了四倍, 算圖時間還是少於原本的四倍, 通常是三倍多.

640x480 : 13.922 | 11.141| 3.484 | 2.578 秒.
1280x960 : 31.874 (2.289x) | 27.391 (2.458x) | 9.718 (2.789x) | 7.532 (2.921x)
2560x1920 : 103.078 (3.233x) | 90.890 (3.318x) | 33.906 (3.488x) | 27.015 (3.586x)

改變Voxel Filter Radius
上面三張圖顯示用密度為5.0/0 Voxel尺寸為5 但是Voxel Filter Radius分別為,2 和 5

當Voxel Filter增加時voxels變得越來越平滑, 導致計算結果越模糊, 而算圖時間也會拉長.算圖時間分別為2.843 | 3.656 | 7.294秒

Voxel Rendering 與 Particle Rendering
以下的BOX包含了一百萬個粒子 其中在Diffuse Map裡面用了Cellular Map 以Particle Mode算圖
第二排顯示一樣的粒子, 但是把Cellular Map放在Opacity Map裡面

第三排則是同時開啟Diffuse 與 Opacity Map
第四排則是一百萬個粒子分割成10個partition然後分別用Particle mode 與Voxel Mode兩種模式來算圖
如果是用Particle mode方法的算圖時間是2.687 | 2.703 | 2.797 | 26.421秒
用Voxel mode的算圖時間分別為8.829 | 8.782 | 8.86秒

經由這些比較, 你會發現一般來說Particle Rendering算圖比較快, 需要相當多數量的粒子才能維持跟Voxel Rendering一樣的密度. 某些情況下Voxel Rendering即便是用了較少的粒子, 還是能達到跟Particle Rendering一樣的算圖效果.

[相關文章]

No comments: