就我想得到的部分發表點淺見
最直接的答案就是電影跟遊戲相比
可以使用的運算資源和時間根本不是同一個數量級的
電影的一個frame可以用幾千幾百台的電腦組成的render farm
運算個幾個小時幾天幾個禮拜,只要最後有把frame算出來,就可以上架沒有問題
遊戲在遊戲主機或PC上,只有一組CPU
一個frame要在33毫秒(30fps)或者16毫秒(60fps)以內運算完
光是模型面數,就不可能用得跟電影模型面數一樣高
更何況算圖只是一個frame的一部份,不要忘了遊戲邏輯本身
舉例來說,這個TLoU:R引擎投影片上秀出的例子(p.62)
該場景的一個frame只有約40%的時間可以拿來算圖
http://bit.ly/2uttjSH
[補充]
的確,現在有可以將高面數模型降低面數的自動化工具
對於簡化背景物體很有幫助,像是石頭、樹木等
但是自動簡化生出來的低面數人物模型,往往佈線不甚理想
佈線不佳的模型,在骨骼複雜的地方運動時容易產生破圖
叫模型師手動修正不良佈線,不如從頭自己做低面數模型來得划算
[/補充]
所以回答這個問題
: 推 tkigood: 最簡單的原因就是面數太多跑不動 07/16 21:42
: 所以是可以做的吧?只是家機不給力?
沒錯,"理論上"有極其強大的硬體可以做到
但是以現在的硬體效能水準和經濟考量,基本上不可能也不實際
說"只是"家機不給力有點過度簡化問題
接下來針對頭髮的問題
: 記得之前哪個動畫一個頭髮插了幾百萬根 … 啊遊戲的可能只給你一個髮片
非即時算圖(又稱離線算圖)與即時算圖,兩者適用的模型定義方式不盡相同
離線運算適用的模型定義方式包含(但不僅限於)
傳統的網線模型(mesh)和隱晦面(implicit surface)
網線模型就是用網線明確定義很多三角形,建構出模型
隱晦面則是用數學函式定義出模型的形狀
不管是用哪個方式定義模型
在算圖的時候就是在每個像素的位置模擬從攝影機位置射出的射線
撞到模型表面的時候計算反彈、穿透與折射的射線,繼續模擬直到事先設定好的限制為止
接下來反推所有碰撞點應該會反彈的光色與強度,算出各像素的最終顏色
這個方法叫做光跡追蹤(raytracing)
針對網線模型的光跡追蹤很直覺
基本上就是解高中數甲的"求線段與三角形的交點"這個問題
隱晦面的光跡追蹤比較麻煩
針對不同的數學函式,要自己推導出適合的射線交點解法
有時候使用的隱晦面甚至沒有辦法用數學算式表達出來(沒有"閉型解")
這個時候就要用數值方法,片段地在射線上面取樣,反覆逼近隱晦面與射線的交點
可以比喻成用十分逼近法求平方根近似值的感覺,反覆朝更準確地答案邁進
這個方法叫做光跡邁進(raymarching),因為有種一步一步前進的感覺
用個球體模型來舉例
網線模型的定義方式就是用一堆三角形拼出個球型
優點包含與其他傳統模型的定義方式一致,且要做形狀微調的話可以直接改變頂點位置
缺點之一是鏡頭放大就會看到稜角
隱晦面定義方式則是使用球心與半徑表達球體
優點是光跡追蹤的時候可以明確算出正確球面,放大不會有形狀上的瑕疵
缺點之一是不方便做形狀微調
雖然說球射線與三角形的交點v.s.射線球體的交點,兩者所需的計算資源量級差不多
但是很多隱晦面定義的模型,與射線交點的計算就複雜許多
頭髮一般就是用隱晦面的方式定義(e.g. 密度、髮流、粗細等)
而且一次幾百萬根,計算量相當可觀
用網線模型表達幾百萬根毛髮,還要看不出稜角,資料量會太大
接下來看看即時運算
現行GPU的硬體架構,適合拿來在螢幕上面繪製三角形
所以幾乎所有的遊戲工作室,自然使用網線的方式定義模型,也就是你說的髮片
主流的算圖方式,是先算出三角形在畫面上佔到的像素
每個像素再執行一小段程式,算出該像素的顏色,這個程式叫做pixel shader
其實這種運算模式還是可以拿來算光跡追蹤啦
方法就是叫GPU繪製一個全螢幕長方形(由兩個三角形組成)
然後每個像素對應的pixel shader,實作光跡追蹤的運算
現行GPU一般來說不夠力執行真正的光跡追蹤運算
所以通常是用光跡邁進來逼近光跡追蹤的結果,並且將邁進步數限制得很低
邁進的步數不夠高的結果,就是會看到"取樣斷層"瑕疵
相信以下這類的毛髮和植披的取樣斷層瑕疵,很多玩家都有注意到
http://imgur.com/a/KFY9v
嗯...目前想到這樣,而且寫得有點累了XD
如果有可以補充的,就幫忙接力一下吧