2014-04-08 63 views
2

我正在嘗試創建包含單位立方體(或球體)的600x600x600網格。只有一些立方體存在。所以,基本上我試圖讓下面的東西像小立方體或球體。OpenGL:渲染大量立方體

A 3D Shadow Hull

問題1:渲染這樣的結構是昂貴的。它需要3個嵌套循環(每次迭代600次)。有什麼辦法可以解決這個問題嗎?

我認爲是將附近的立方體合併爲一個單一的(八叉樹),因爲我的情況下不會有太多的空白。但我想要一個通用的解決方案。你認爲上面渲染這樣的場景需要多長時間(看起來像是250x250x250的場景)?

問題2:實例渲染是否與我的問題有關?

注意:在這裏,我將體素表示爲立方體,而立方體又需要6個四邊形。

回答

0

事實上,問題1可以通過將各種立方體組合到一個大立方體中來處理。體素引擎通常將多個單獨的盒子分組在一起。這也許是最好的選擇。其次,您可以爲每個體素以及包含這些體素的塊使用布爾變量,並將其設置爲1以進行渲染,否則設置爲0。 根據您的要求,您將需要體素類,塊類和其他抽象。

+0

我擁有所有的班級結構。主要問題在於迭代。當你有一個棋盤結構時(當沒有立方體與其他立方體相鄰時),組合立方體將不起作用。你有什麼通用的解決方案?在着色器和所有的變化? 另外,是否可以存儲600x600x600布爾變量。 – Shashwat

+0

檢查板結構使事情變得相當複雜。我還沒有想到一個合理的答案。儘管您可以嘗試使用https://sites.google.com/site/letsmakeavoxelengine/home獲取某些參考信息。 – Beowulf

0

也許創建一個幾何着色器,爲網格中的每個點複製一個盒子。智能化編程着色器,使其不會輸出偏離視圖的兩側,也不會出現旁邊有「活動」框的一側。

問題是提供幾何着色器600 * 600 * 600大小的布爾值。如果複合「對象」有點固定,也許你只需要在每個立方體的每一行/列上提供開始和結束位置,所以:1,4,90,345表示填充立方體的位置從1到4,從90到345。

0

問題1:

我不」知道你是怎麼想出呈現3個嵌套循環。我看到一個巨大的循環與600^3體素。你想要做的最後一件事是逐個渲染每個體素,因爲你的GPU是一個流式多核處理器,並且你的數據幾乎是相同的,除了空間翻譯。公平起見,這個數字可能有點太高,開始。目前大約需要64,000個立方體以11毫秒渲染,但如果您有靜態場景設置,則可能會更快。請參閱:SVO Rendering: OpenGL or Custom renderer?

您可以做的另一件事就是LOD場景,即只渲染真正必要的東西。你真的對遠處的體素感興趣嗎?如果他們的子像素大小,你可以代之以渲染一個四角冒險家。

問題2:

實例渲染肯定是解決方案的一部分,因爲是VBO的和維羅的,但也有其他方式只喜歡在幾何着色器發送的座標,併產生實際幾何結構。另請參閱http://sol.gfxile.net/instancing.html

如果您有靜態場景,則可以將性能提高近5倍。

1

過去我已經完成了體素渲染引擎。這裏有一些快速優化,我可以建議,這將提供一個很好的速度提升:

  1. 使用幾何剔除算法來剔除未呈現的位。我使用八叉樹,因爲他們很好地與體素。
  2. 將您的可見節點從前到後排序,並使用一些算法確定哪些節點根本不可見。另外,要充分利用遮擋剔除。
  3. 像其他人所建議的那樣使用幾何着色器。
  4. 有一個LOD計劃。簡而言之,如果兩個立方體可以合併爲一個,並且結果對於用戶而言是不可感知的,那麼就這樣做。良好的LOD方案可以大大減少您正在呈現的數據量。
  5. 請記住,最好的多邊形是一個沒有繪製的:)。

正確完成這三件事會給你一大塊你正在尋找的提升。之後,它會根據您的需求和要求進行一切調整。