UNITY渲染為什麼不把模型拆分,即使只有乙個頂點在攝像機內也要把整個模型渲染出來?

時間 2021-05-06 09:33:01

1樓:PZZZB

按我的理解,對圖元進行剔除的操作CPU遠遠沒有GPU快。所以CPU做的是模型層面的剔除,GPU做的是圖元層面的剔除,這樣效率是最高的。

2樓:小旭

感覺應該是取捨問題

如果你的問題在於面數不多的模型,感覺沒必要這麼做,執行時拆分反而會加重cpu的開銷

如果你的問題在於面數比較多的模型,確實應該使用static batch的方法將mesh切成submesh,基於submesh進行剔除,減少繪製頂點

3樓:leinlin

貌似只是把頂點丟給gpu了,gpu有螢幕外頂點移除…並不會光柵化。emmm ,不行還可以把模型切割開來的drawcall 也會高一些……

4樓:Milo Yip

傳統的引擎會做 object-level 的剔除,一些較新的引擎會做 cluster-level 的。引用一下 RTR4 §19.8 [1]:

這類「現代方法」通常會採用 GPU compute shader 進行剔除,把結果直接用於渲染,避免了以往需要為每個 cluster 呼叫 draw-call 的問題。

我沒去了解 Unity 較新的版本有沒有做這種加速。

[1] Akenine-Moller, Tomas, Eric Haines, and Naty Hoffman.Real-time rendering. AK Peters/CRC Press, 2018.

5樓:某人

好久沒搞Unity了,我怎麼記得在渲染階段是有剔除的來著?說是整個模型渲染,其實只是讀取了整個模型,但渲染的時候其實是有剔除的。

判斷的標準是:CPU檢測乙個模型是不是需要被渲染,GPU檢測被渲染的模型應該渲染哪幾個面。這樣一來,都能夠充分利用各自的優點。

6樓:Binarizer

這也是個好基礎的問題啊。首先問題有點不對,只看到乙個頂點,也必須要跟它相連線的幾個頂點配合,才能把看到的幾個面渲出來嘛。

然後,問題要是換成為何不只渲看到的幾個面,那怎麼去判定哪些面需要渲染?這就涉及到效率問題了,你當然也可以拿CPU對每個模型去遍歷面做剔除,問題是這麼高並行的事,為啥不直接扔給GPU做呢?實際上gpu在光柵化階段是有專門做麵剔除的運算器的,而CPU應該做的是大粒度的剔除,每個模型級別的。

而且VS這一步一般都算力過剩,並非瓶頸,GPU裡很多有和PS的並行機制,省幾個頂點無價效比,甚至現在還會做曲面細分來進一步增加面數。

進一步說,為啥引擎沒做自動拆分模型呢,把大塊模型再細分?首先每幀都要重新拆的話,需要每幀都去更新頂點快取(確切說是index buffer),雖然也不算費吧但是挺煩的,所以一般是在預處理階段就拆好的。然而要想自動拆分就屬於數學範疇啦,模型這種東西,合併起來簡單,拆起來麻煩啊。

總歸我是不懂的,大部分引擎也是懶得做的,都是靠美術自己去手動把握。這也是為啥TA很吃香的原因了,每個場景位置模型該拆多大,都是有規範的,讓傳到GPU的頂點數盡量小。

另外,我記得由於頂點數影響沒drawcall厲害,unity甚至有反著來優化的,把場景所有同材質靜態模型,盡量合到一起,只為降低drawcall,反而不管頂點數多少了(靜態合批,非hwInstancing)。

為什麼this war of mine不把背景設定為軍力碾壓的戰勝國?這遊戲的本質是不是反戰敗?

孫克儉 說實話,你的思想很危險!二戰前期日本國民的思想就是通過戰爭把國內的矛盾轉移到國外,提公升本國生活質量 然後戰敗了就各種反思戰爭後期的國民生活如何差,那是真的反戰麼? Chris Tinman 神經病問題,波赫戰爭是內戰,內戰哪他媽的有勝利,打死的每乙個人,打壞的每一件東西都是淨損失。在校生不...

你為什麼不用unity引擎?

邱昊宇 安裝時拖家帶口乙個 Visual Studio MonoDevelop 雖然可以關掉單獨裝,但本質還是裝了 不喜歡大括號獨佔一行 不喜歡切出去編輯指令碼 Net 導致了 VB 的毀滅,厭惡度 10086國內大有把 C Unity 遊戲劃等號的趨勢,我非常討厭這種趨勢看到 Godot 之後反正...

渲染管線裡為什麼geometry stage在tessellation stage的後面而不是前面?

xiaocai 已經有應用角度的答案,我從pipeline的角度談一下 1.放在前面沒啥好處 Tessellation stage吃進的Primitive Type是Patch 1 32個Control Point 如果把GS置其前,GS所起的作用就是對Patch做一些處理 比如Transform,...