2014-09-13 119 views
3

我正在研發適合非常大型場景顯示的3D引擎。 渲染本身(截錐體剔除,遮擋剔除等)的公寓,我想知道什麼是場景管理的最佳解決方案。大型3D場景流式傳輸

數據作爲一個巨大的3D meshs的名單,與他們沒有關係,所以我不能生成的門戶網站,我想......

的主要目標是能夠在運行該引擎具有低RAM(500MB-1GB)的系統,並且加載到其中的場景非常大,可能包含數百萬個三角形,這會導致非常密集的內存使用量。我實際上正在使用一個鬆散的八叉樹,在加載時構建,它在中小型場景中運行良好,但許多場景僅適用於完全適合內存的場景,所以在這裏提出我的問題:

你處理場景來動態地加載和卸載塊(並且理想地無縫地),並且你將基於什麼來確定塊是否應該被加載/卸載?如果需要,我可以創建自定義文件格式,因爲場景使用已知3D製作工具上的自定義導出器導出。

重要信息:許多場景由於其構造而無法有效遮擋。例如:一個非常巨大的管道網絡,所以沒有太多的遮擋,但有很多元素。

回答

0

我認爲最好的解決方案將是一個「解決方案包」,一套不同的技術。

  • 如果未使用的級別未加載,詳細程度(LOD)級別可以減少內存佔用量。通過在舊的和新的細節之間使用alpha混合,它可以或多或少地被無縫地改變。最簡單的控制器將使用相機的網格距離。
  • 當對象上傳到GPU(設備)時釋放主機內存(RAM),並且顯然釋放所有未使用的內存(OpenGL資源)。 Valgrind可以幫助你做到這一點。
  • 使用低質量的網格並使用曲面細分來增加視覺質量。
  • 使用VBO索引,這應該會減少VRAM的使用並提高性能
  • 如果可能,不要使用網格,地形可以使用heightmaps進行渲染。有些東西可以通過程序生成。
  • 使用凹凸或/和正常圖。這會提高質量,然後你可以減少頂點數。
  • 將這些「管道」分成不同的網格。與2D圖像
  • 假3D網:騙子,skydomes ...
0

如果RAM的大量將是由紋理使用,還有諸如GraniteSDK,提供無縫LOD-可用的商業軟件包基於紋理的紋理流式傳輸使用虛擬紋理緩存請參閱http://graphinesoftware.com/granite。或者你可以看看http://ir-ltd.net/

事實上,你可以使用相同的技術從着色器中的紋理數據實時地構建poly,但它會更復雜一些。

對於體素而言,有一種技術可以完全在GPU內存中構建八叉樹,並且可以頁/出你真正需要的部分。然後可以使用光線投射完成渲染。看到這篇文章:Use octree to organize 3D volume data in GPU,http://www.icare3d.org/research/GTC2012_Voxelization_public.pdfhttp://www.cse.chalmers.se/~kampe/highResolutionSparseVoxelDAGs.pdf

它涉及到如何靜態場景將是如何,並從中,你可以根據你的vizualization需要預烘烤數據。如果您可以事先確定可見性限制(例如,Google潛在可見性集),並對其進行組織,以便您可以根據請求進行流式傳輸,它已經有所幫助。由於可視化工具會有限制,因此您總是最終採取一種策略,儘可能快速準確地將一部分數據放入GPU內存。

+0

感謝您的回答,沒有在場景中沒有紋理。體素引擎是一個真正的解決方案,牢記我的場景只是多邊形集合,我不知道對象的體積。場景完全是靜態的,沒有任何物體會移動。但我必須能夠按需隱藏一些對象(不是什麼大問題) – ingham 2014-10-13 07:42:49

+0

它取決於對象的類型。如果渲染多邊形並且您期望某些或所有對象具有非常高的細節,那麼基於對象的基於LOD的解決方案可能更合適。如果除了變換矩陣或着色器參數外,很多對象在幾何上都是相同的,請查看實例化渲染(即管道示例)。 – StarShine 2014-10-13 11:26:59

+0

那麼一個包含大量不同小物體的場景(例如〜500 000個〜100-300個三角形物體)呢? – ingham 2014-10-13 14:20:20