簡體   English   中英

OpenGL體素引擎速度慢

[英]OpenGL voxel engine slow

我正在使用C ++和OpenGL(àlaMinecraft)制作一個體素引擎,並且使用ATI X1600無法在我的3GHz上獲得不錯的fps ...我完全沒有想法。

當我在屏幕上有大約12000個立方體時,它會降到20fps以下 - 可悲。

到目前為止,我的優化是:視錐體剔除,背面剔除(通過OpenGL的glEnable(GL_CULL_FACE)),引擎僅繪制可見面(當然除了剔除面)並且它們位於八叉樹中。

我試過VBO,我不喜歡它們,它們不會顯着增加fps。

Minecraft的引擎如何如此之快......我在10000立方體中掙扎,而Minecraft可以在更高的fps下輕松繪制更多。

有任何想法嗎?

@genpfault:我分析連通性,只為外部可見表面生成面。 VBO有一個我glTranslate()d的立方體

我不是OpenGL的專家,但據我所知,這將節省很少的時間,因為你仍然需要將每個立方體發送到卡上。

相反,你應該做的是為所有外部可見表面生成面,將其放在VBO中,然后將其發送到卡片並繼續渲染VBO直到幾何體發生變化。 這可以節省您的卡實際等待處理器向其發送幾何信息的大部分時間。

您應該對代碼進行概要分析,以確定應用程序中的瓶頸是否在CPU或GPU上。 例如,你的剔除/ octtree算法可能很慢,在這種情況下,它根本不是一個OpenGL問題。

我還會計算你在每一幀上繪制的立方體數量,並在屏幕上顯示。 這樣您就知道您的剔除程序按預期工作了。

最后你沒有提到你的立方體是否有紋理。 嘗試使用較小的紋理或禁用紋理,並查看幀速率增加了多少。

gDEBugger是一個很棒的工具,可以幫助您找到OpenGL的瓶頸。

我不知道這里是否可以“碰到”一個老問題,但我想到了一些事情:

如果您的體素是靜態的,您可以通過使用八叉樹進行視錐體剔除等來加快整個渲染過程。此外,您還可以將靜態場景編譯為八叉樹中的潛在可見性集。 PVS的主要原則是對樹中的evere節點進行預計算,其中其他節點可能從其中可見,並在向量中存儲指向它們的指針。 當談到渲染時,首先檢查攝像機放置在哪個節點,然后對節點的PVS矢量中的所有節點進行平截頭體剔除。(Carmack在Quake引擎中使用類似的東西,但使用二進制空間分區樹)

如果你的體素的陰影很復雜,那么在沒有寫入顏色緩沖區的情況下,只需要填充Depthbuffer,也可以快速執行預深度傳遞。 之后,您渲染第二遍:禁用寫入深度緩沖區並在檢查深度緩沖區時僅渲染到Colorbuffer。 因此,您可以避免昂貴的着色器計算,這些計算器稍后會被更接近查看器的新片段覆蓋。(Carmack在Quake3中使用了它)

另一件肯定會加快速度的事情就是使用Instancing。 您只存儲每個體素的位置,如果必要,將其比例和其他參數存儲到texturebufferobject中。 然后,在頂點着色器中,您可以讀取要生成的體素的位置,並創建體素的實例(即,在vertexbufferobject中為着色器指定的立方體)。 所以你發送8個頂點+ 8法線(3 * sizeof(浮點)* 8 + 3 * sizeof(浮點)* 8 +浮點數的顏色/紋理等...)只有一次到VBO中的卡然后只有TBO實例的位置(3 * sizeof(浮點)*體素數)。

也許可以通過組合2個線程中的所有3個步驟來並行化GPU和CPU之間的事物,在CPU線程中檢查八叉樹pvs並在下一幀中更新TBO以進行實例化,GPU線程同時渲染2在使用TBO進行實例化時傳遞,這是由上一步中的CPU線程創建的。 之后你切換TBO。 如果相機沒有移動,您甚至不必再次進行CPU計算。

我感興趣的另一種樹是所謂的kd樹,它比八叉樹更通用。

PS:對不起我的英語,這不是最清楚的......

您可以使用第三方庫來提高渲染效率。 例如,C ++ PolyVox庫可以獲取卷並以高效的方式為您生成網格。 它具有內置方法,可減少三角形數量並幫助生成環境遮擋等內容。 它周圍有一個很好的社區,所以在論壇上獲得支持應該很容易。

您是否為所有立方體使用了通用顯示列表?
您是否跳過調用用戶不可見的多維數據集的繪圖代碼?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM