2011/04/24

Krakatoa 2.0 全速前進!


這篇是由Maxscript大師Bobo祂的部落格發表關於新版的Krakatoa 2.0的效能提升, 由於不是正式的產品文所以比較口語 (比較難翻譯), 又提到很多數字(million, billion)加上邏輯性的段落, 增加了一點翻譯的困難度. 後段感覺是在替Fusion-io打廣告, 不過, 未來硬體速度絕對是CG特效的一個關鍵 (其實現在就是這樣). 到時後用固態硬碟做特效的時候, 應該會變得更有趣~

Enoy!

------以下為翻譯-----
原文網址點這裡
作者: BORISLAV PETROV (Bobo)
譯者: Hammer Chen

全速前進
發現我有好一陣子沒貼文了, 在Frost, Krakatoa's BFF發片前也沒有發文, 之前在拉斯維加斯待了至少四天, 展示Deadline, Krakatoa與Frost給大家看, 我想現在是寫寫關於未來發展的好時機...

你應該還記得我之前寫的: "多快才算快?" 關於Krakatoa 1.6, 那次的升級還不太可能會有明顯的效能躍進. 這樣想是沒錯,, 我也有數據支持這種說法 事實上, 下一版的Krakatoa會比從1.6到1.5的速度提升相比要多很多!

產生分割並載入PRT序列檔案, 是Krakatoa標準作業流程, 傳統上載入粒子的時間大約是算圖時間的一半. 有幾點因素會影響載入的速度: 一是硬碟的速度 (如果檔案存在網路硬碟), 二是網路傳輸速度 CPU的讀取資料的速度, 與將解壓縮的資料串流道記憶體的速度, 還有其它操作會影響到粒子載入速度, 如MagmaFlow與 Material evaluation, 或是形變與culling都會影響. 在以前, 後者的操作慢慢都支援多核心的計算,了 但是起始載入的動作還是只有兩核心的計算而已, 而且通常只會讓單核滿速.

現在不再有這個問題啦! 我很高興來測Krakatoa 2.0的alpha效能如何, 在不同的電腦配備與不同的硬碟資料量, 為了要測載入速度, 我先做了一個長寬高100的box 轉換成PRT Volume,, 然後分割 儲存到硬碟中分成100個分割組. 每一個分割都有一百萬個粒子, 請注意! 要載入每個有一千萬個粒子, 總共有10個分割檔, 這樣會產生多的開銷, 或者也可以一個分割檔, 包含了一億個粒子, 後者會比較快, 但是我想要做出比較最糟糕的狀況, 因為Krakatoa會受限於3dsmax本身, 而且這樣的測試方法還有個優點, 就是可以產生很多計算量讓每個CPU核心都能工作. 為了要模擬出一般的狀況, 我採用預設的頻道輸出, 位置, 速度, 法線, 顏色, 密度與ID. 縱使我平常不開速度或是ID這通道, 接著我產生一個PRT Loader, 載入100個分割, 放一盞spotlight.

到了實測階段, 首先我用了比較舊的電腦來測 (這台我們用在拉斯維加斯的NAB產展示Thinkbox功能, 配備是dual Intel Core Duo, 也就是四核心, 沒有Hyperthreading). 這台有一個7200 轉的硬碟, 兩個10000 轉的硬碟, 一個SSD硬碟, 還有一個Fusion-io卡 (固態硬碟). 這些硬碟都接在同一部電腦中, 這樣我就可以找到不同的儲存媒體對這個新軟體有怎樣不同的效應.

為了比較差異, 我先用了1.6.1版, 結果花了57.3秒載入一億個粒子, 花了兩分46秒算圖. 不管我用哪種硬碟都一樣, 因為載入的速度取決於PRT壓縮檔的核心讀取速度.

如果我用新版的Krakatoa 自7200轉的硬碟載入, 則花了38.2秒, 總算圖時間為兩分29秒. 這樣的速度提升不是很令人激賞, 但是有達到硬碟的物理極限了, 因為已經達到CPU存取的瓶頸了. 例如你有四核心 4線程(threads)的CPU同時讀取4個PRT串流資料, 硬碟沒有辦法跟得上CPU的速度!

而從兩個10000轉速的硬碟, 在硬碟的頻寬達到最大限度之前, 四核心的CPU才達到80%的運轉率而已. 測試載入一億個粒子時, 整個載入時間降到了16.1秒!相當棒! 當然囉, 如果用固態硬碟的話預期會有更高效能... 真的耶! 同樣的測試用固態硬碟載入時間僅花了11.2秒, 算圖時間為1分49.96秒, 而且四核心的CPU都完全滿載了. 如果我用更快的Fusion-io card進行實驗, 結果是跟故態硬碟一樣的載入時間, 一樣的算圖. 這樣的結果證明了我們達到了CPU的瓶頸(譯者註: CPU可以完全發揮效能的意思).

很感謝Fusion-io在NAB也有展覽, 我有機會用到八核心的電腦來測試水特效 直覺告訴我 CPU核心達兩倍時, 載入時間應該可以減為一半. 所以當我'載入1億個粒子, 才花六秒就載入檔案, 而算圖才花52秒, 我一點也不意外! 幸還是不幸, 所有八核心的CPU這時候都完全滿載了, 現在整個狀況反過來了---是CPU變成運算的限制, 而不是硬碟速度. 這樣個結果讓我更想用16或是32核心的電腦來看看Funsion-io固態硬碟真的能把Krakatoa發揮到怎樣的狀況?!

我的直覺是應該可以讓載入時間降到3秒 甚至更少, 可是當我真的用16或是32核心的電腦測試效能時, 還是可以接受結果啦. 照理來說, 好的SSD硬碟應該也可以跟得上8核心的電腦, 達到6秒的載入時間, 所以你不需要花買一部車的錢就可以達到好的效能.

新版的Krakatoa有幾個地方有加強效能, 用我家裡面的i7 quadcore電腦來測試 如閃電般快速地, 載入一億個粒子由舊版的12秒降到8秒, 而drawing時間由5秒降到4秒. 我的電腦不是很適合拿來做測試, 因為我的硬碟很慢, 所以你可以想像, 如果是用最新的電腦配備, 有很多的CPU核心, 有快速的SSD硬碟Krakatoa真的會在今年下半年飛起來呢!

當然, 這只是新版的Krakatoa牛刀小試而已, 等著看今年的Siggraph吧, 一定會很令人興奮! 至少我會很興奮啦...

---翻譯完畢---

[推薦文章]

2011/04/21

Thinking particles的物理碰撞與輸出


Cebas Thinking particles可以做出很多變化, 但是如果只是單純要用來做物理碰撞模擬, 反而不會比Particle Flow困難. 要讓TP產生的粒子進行真實的物理碰撞就要靠Opertaor/ShapeCollision/SC 的Operator.


雖然說SC Node有處理碰撞的參數, 不過每個Particle Group裡面也有Voxel Grid的參數. 如果模擬結果覺得有黏滯感, 可以把Dynamic Friction由100調降到10左右即可.

PhysX plugin沒有concave的類型 必須手動許多基本模型拼湊出凹面的碰撞體.

Rayfire不支援使用Concave的模型. 雖然可以用Group的方式處理, 但是比較麻煩.

一般在用NVidia PhysX 3ds max plugin或是Rayfire做物理模擬時都要考慮凹面或是凸面. 大部分與設定都是用凸面(convex)在做計算, 所以如果模型如甜甜圈這種有凹面的就容易有計算錯誤 或是粒子外推等問題.

紅色代表voxel的點, 密度越高碰撞越精確.

Thinking particles身為好萊屋特效等級的外掛, 它的物理計算就多了叫Voxel的計算基礎. 類似FumeFX 的voxel grid, 它的計算像Tutbosmooth之於polygon類似, voxel grid越高 就會把原本的模型細分的越細. 所以在做物理模擬時 第一要考慮佈線要平均, 再來就是以Turbosmooth的角度來思考voxel grid要設定多高. 一般到30就夠了.

Edge sample是對模型的edge的採樣, 對於那些狹長的面很有用, 如果模型有狹長的面那就把這個數值提高.

在SC Operator裡面Show Voxels裡面可以顯示粒子之間的碰撞. 勾選Initialized Only是只有真正碰撞的時候才會顯示 (螢光綠點), 可以用在debug用.

Collision leak指的是粒子跟粒子之前沒有正常的碰撞 (相互穿透) 比方說用TP做茶壺掉到地上, 茶壺沒有在地板反彈 卻直接穿透了地板, 這就是collision leak. 要怎樣避免呢? 首先模型的細分要夠 再來就是voxel grid的要夠高; 可是對於快速移動的物件還是很容易發生穿透的問題怎麼辦? 可以以試著提高FPS, 由30往上提高. 在某些情況甚至要增加到24000

TP縱使效能比PF要好很多, 可是在計算大量物理碰撞的時候, 場景的動畫還是很重. 於是就需要把動畫bake 或是直接輸出帶key的模型. 後者可以把TP整個殺掉, 動畫還是在.

要把粒子輸出成帶key的obj, 其實很簡單. 只要把想要的group串接到Operator/Expot
按下Export按鈕 這時就可以把粒子輸出成帶key的模型了, 這時候可以把TP整個殺掉, 交給工作流程下游的夥伴.


另外一個讓playback變快的方法是用快取, 這個方法的缺點是會產生很大的快取檔 優點是不會有像export方法會有產生先隱藏再顯示的物件 (當使用volumebreaker的時候會有這樣的問題). MasterDynamic裡面就可以設定FPS (或稱做Sample), 採樣越高就越不會有穿透的問題. 按下RECORD按鈕就開始寫入快取了, 計算完畢後動畫就會變得很輕, 可以接著做其他特效操作, 比方說FumeFX.

Thinking particles碰撞的缺陷: 一般來說把FPS提升到2400加上夠高的Voxel Grid就可以避免collision leak; 可是有種狀況卻很容易發生碰撞穿透, 那就是計算粒子之間旋轉的碰撞, 例如鍊子的旋轉就很容易讓碰撞穿透, 這大概是一個TP的罩門.




大致上掌握這些重點就可以很歡樂地用TP玩物理了.

---完----

[相關文章]

2011/04/17

3ds max 2012 substance material 教學


利用Substance Material製作出來的磁磚效果, 可以表現出很多細節, 還可以表現Vray的反射功能
Autodesk 3ds max 2012版新增了自allegorithmic公司買過來的程序性材質外掛. 雖然很強大但是如果不會串節點的話可能會覺得無用武之地. "為什麼不做成簡單的材質庫給我套用就好?" 大概有人會這樣抱怨, 這邊介紹由allegorithmic釋出的script工具可以讓你更快速地使用這強大的程序性材質, 不管是mental ray或是Vray都能使用substance material的威力. (範例是用max 2011, 但是max 2012也適用)

2011/04/03

UDK三月份新增功能

最近CryEngine動作頻頻, 向來搞金字塔頂端的CryEngine不知會不會在推出免費版後市場上後來居上; 而在市場上耕耘許久, 相對平民化的Unreal Engine在畫質與地形處理上是否能趕上CryEngine呢? 拭目以待~

---以下為翻譯---
Epic公司最近展示全新的Unreal Engine 3 即時展示作品---Samaritan. 這套利用了DirectX 11 高階的算圖功能, NVIDIA APEX物理運算科技等等的新增功能. 這些新的功能你也可以在三月版的UDK裡面找到. 你可以到 Wired, TIME與IGN等網站看到相關報導與影片.
有了影像為基礎的反射效果, 在倒影裡面可以清楚看到人行道反射的字

清楚的陰影效果外加帶有細節的反射

重要的DirectX 功能包含了
  • Tessellation 與 displacement;
  • Geometry shaders
  • Multisampled textures
  • Shader Model 5
不同程度的多邊形細分效果(Tessellation)

高階的算圖功能包含了
  • 用貼圖當做反射來源(Image-based reflections) 能夠套用到任何模型表面, 模擬出逼近的場景反射效果, 還可以達到可變的光澤度, 異向的HDR高光(anisotropic HDR highlights) 與反鋸齒.
  • 次表面散射Subsurface scattering (SSS) 能模擬出光線在半透光的模型內部的散射效果, 讓角色的皮膚表現更加栩栩如生.
  • 反鋸齒遮罩的材質會對遮罩的邊界進行超級採樣, 且會對材質進行alpha-test, 讓角色整體效果比過去更加的寫實.
  • 支援MSAA(Multisample anti-aliasing)的延遲渲染功能(Deferred rendering)
  • 接近電影品質的散景效果(Bokeh) , 提供美術人員能夠調控的散景效果
  • 高品質的動態陰影 場景中的多種類型燈光都支援, 例如點光源或是其他類型的燈光來源
  • NVIDIA的 APEX科技這次也終於完全整合到UDK裡面了
左圖: 未開啟bEnableMaskedAntialiasing; 右圖:開啟bEnableMaskedAntialiasing

場景綠色部分使用到延遲渲染功能(Deferred rendering)

儲存在G-buffer的不同材質屬性

材質編輯器新增了SSS的結點

均向的反射效果

異向性(anisotropic HDR)的反射效果

SSS表面散射表現皮膚材質


而且 Epic這次還提高了免權利金的機會, 在新的授權條約, 遊戲開發者不必支付任何的權利金, 直到該遊戲的總收益超過$50,000美金 .還有, 遊戲開發者可拿75%的收益, 而Epic得到25%.你可以點這裡看相關資訊.

三月版的新增功能介紹
  • 支援DirectX 11
  • 自適應的散景效果(Bokeh DOF)
  • 你可以自行選擇散景的形狀 用在鏡頭耀斑(lens flare)上面
  • 紅色區域代表完整品質 綠色區域代表部分的品質 (效能會有四倍快)
  • 動態陰影與影像為基礎的反射(HDRI)
算圖
可以縮放特效(例如散景與光暈效果) 添加了大小顯示
Post Process Effect -> Scale Effects with View Size

新增了能夠在流體表面使用重複的法線貼圖( tiled normals)


Unreal Landscape 這是全新的地形系統

Landscape地型編輯的工具列

建議的場景地圖尺寸, 這次Unreal Engine 3的Landscape功能主要由Epic韓國部門開發, 主要就是要補足MMO需要大型地圖的效能等問題.

新的地型材質混合模式

支援像 ZBrush那樣的繪圖功能
支援繪圖板的靈敏度
在繪製圖層時 多了一個自動更新weightmap mipmaps的選項
在Noise tool裡面多了Perlin Noise的類型
支援溫度與水對地形腐蝕的效果

支援NVIDIA APEX:NVIDIA APEX科技讓用戶能夠很快速地產生物理模擬的布料飄動 或是場景破壞的效果 想要知道更多有關於APEX的資訊 請到以下網址

Unreal Editor編輯器相關
在編輯器裡面可以啟用DX11 renderer 的功能
View ->; Preferences ->; Enable DirectX 11 Rendering

透過新的 show flag 你可以查看哪一個景深(DOF)圖層有對到焦
  • 你可以透過Unreal Matinee來開關影像反射
  • 在工具列裡面你可以切換貼圖的棋盤格背景
  • 以FBX格式導入morph targets時 會使用多核心計算 這樣可以加速導入時間
  • upk package裡面有遺失的物件時 會顯示更好的錯誤回報
  • Matinee現在支援可視度的軌道切換( jumping on the visibility interp track)

[相關文章]

2011/04/02

thinkingParticles R4: volumeBreaker程序性碎裂


近花了點時間把很久以前就想學的thinkingParticles弄懂了它的使用流程. 用這個東西可以實現程序性的碎裂效果: 也就是一旦節點都串好了以後 只要替換模型就可以隨時產生新的寫實碎裂效果了. 相當的理想.

這裡翻譯整理出主要涉及的操作子(operator)的重要參數:
  1. ShapeCollision 用來計算實體碰撞
  2. VolumeBreak用來把模型切碎
  3. VolumeActivate Operator用來控制模型碎裂的動態過程

---以下為翻譯---

//SC Operator//
SC是新的 ShapeCollision操作子(Operator), 這是原廠要來取代舊的ShapeCollision operator. 這個新的操作子能夠提供更好的解算功能, 用的是最新的演算法來計算剛體動態, 提供更快速, 更精確的結果, 跟舊的相比會更有效率, 效能也比較好! 但是為了能向下相容, 舊的 ShapeCollision還是保留在那邊, 算出來的結果跟以前一樣.

我們建議你用新的SC操作子, 不要用舊的ShapeCollision!

用新的SC有以下好處:
  • 支援多點Joint類型
  • 加強對多核心計算的支援
  • 再也不需要指定接觸的類型了(contact type)
  • 加快了整體速度
  • 大大的減少了快速的抖動問題
  • 添加了Voxel debug模式
SC操作子的威力到底如何呢? 我們可以在暢銷的電影2012裡面知道它的成功, 這在電影裡面的破壞特效暫了重要角色!

雖然你可以在 DynamicSet裡面添加多個 Shape Collision operators, 建議你盡量用越少越好, 因為這會需要大量的記憶體來計算.

Floor Node - (Node) 地面節點. 這個節點可以輸入地面的資料做為碰撞之用, 地面物件會自動設定為不可移動, 且具有無限大的質量.

Collision Iteration 碰撞迭代計算. 這個參數可以用來計算物件的真實碰撞點, 這個數值越小, 模擬的速度會越快, 但是結果會不精確. 大部分的狀況建議你設定成5-10, 如果你希望結果精確一點那可以設定成30.

Contact Iteration 接觸的迭代計算. 用來計算兩個物件接觸的細分, 產生的接觸狀況, 面對面(face to face)在物理引擎裡面是最複雜的計算狀況, 增加這個數值會產生更寫實的模擬結果.

Deactivation Time 取消作用的時間. 這個參數用來控制粒子到底是真的在移動還是只是在胡亂的抖動, 如果粒子落在這個時間區間裡面, 則會參考它的速度或是旋轉數值, TP4會據此來決定是否要讓粒子進入休眠或是凍結狀態. 這個參數越小粒子就凍結的越快, 這個參數會跟以下兩個參數協同作用一起影響粒子的動態.

Velocity Threshold 速度的閾值. 這個參數定義最小速度, 讓粒子進入凍結狀態.

Rotation Threshold旋轉的閾值. 這個參數定義最小旋轉數值, 讓粒子進入凍結狀態.

//VolumeBreak Operator//
VolumeBreak操作子是一個會計算實體模型碎裂的工具. 這個操作子是由 volumeBreaker為基礎, 快速地創造出模型的碎片.這些碎片是真的根據模型體積計算出來的.有了 volumeBreaker , cebas公司帶給您好萊屋特效等級的破壞工具, 而VolumeBreaker的開發有徵詢過顧問以及特效專家們 , 這些專家參與的都是數百萬等級的大電影的人.

VolumeBreak幾乎可以套用在任何類型的模型, 包括那種很懶惰的人做出來的模型 (沒有完全閉合的模型). VolumeBreaker 會試著補償模型本身的錯誤, 例如沒有焊接的點, 或是開啟的邊(open edges). 這個操作子所計算出來的碎片能夠被thinkingParticles其它的操作子所取用.

Activate 啟動碎裂. 定義碎裂的百分比, 100%代表完全碎裂 ; 0%代表完全不碎. 通常會對這個參數設定動畫 當然你也可以用動態的方式控制

Raster
細分的大小 這會計算每個碎片的最小距離 因此可以控制碎片的大小 請注意如果把這個參數設定太小或產生大量模型碎片 會耗費許多計算時間

//VolumeActivate Operator//
這個操作子是thinkingParticles的新血, 把TP的整體功能強化! 這是第一次你可以在TP裡面進行跨DynamicSets的, 把資料由一個操作子餵到另外一個操作子的功能. 這個特殊的功能, VolumeActivate operator可以取代並且蓋過 VolumeBreak operator的activation data. 如此, 你就可以用TP做出多點衝擊(多個撞擊點)的效果了!

簡單的說, 你可以控制 VolumeBreak operator裡面的物件何時碎裂, 在哪個地方碎裂, 以及要怎樣碎裂. 請注意, 這個VolumeActivate Operator必須要搭配VolumeBreak operator才能使用, 而且是被用來告訴VolumeBreak operator他哪邊要進行碎裂(透過Position input); 碎裂的範圍有多遠(透過Initial Length控制) ;而這個範圍擴張的速度有多快 (由Spreading Second控制); 甚至也能決定發生的位置類型(World, Object, Normalized).

Position - 起始長度. 設定volumeBreak碎裂效果的起始長度, 這個長度是以 position 參數為中心做為起始, 告訴VolumeBreak內部碎裂的起始範圍, 來決定啟動 VB fragments的範圍有多廣.
Spreading Length - 擴張長度. 定義碎裂由上述參數起始, 最大可延伸到多大的碎裂範圍.

Spreading Second - 擴張秒數. 這設定要釋放所有的碎片要花多久的時間 , 這個參數可以用來模擬出震波效果.

----翻譯完畢----

[推薦文章]