2014-03-12 140 views
0

首先,我對3D編程和libgdx非常陌生。 我看了幾個教程,我已經渲染了我想要的場景。我有一些1x1x1塊,用每個可見面的ModelBuilder.createRect()創建,所以如果另一個塊覆蓋此塊的面,則不會爲此塊創建矩形。也不需要頂部和底部矩形,因爲我永遠都看不到它們(除了地板)。所以我想,這非常有效。我也有Backface culling啓用,我做Viewfrustum culling。但是,如果我朝着一個方向看,那麼在我看來有很多街區的地方,FPS就會下降到15-20。這對我來說還是可以的,因爲我的筆記本電腦已經超過5年了,它的性能並不是最好的,但是this answer讓我覺得。使用Libgdx進行高效3D塊渲染

「模型構建器僅用於調試」。好吧,但我應該如何創建我的盒子?爲什麼我應該在建模應用程序(如Blender)中創建Model,對於簡單的方塊?通過這樣做,我甚至無法剔除被其他區塊佔用的面孔。 所以我的問題是: 我如何創建和渲染那些盒子是最有效的方式?

+0

IIRC,你的方法會導致每個矩形的一次繪製調用,如果你有很多矩形,它將變得非常昂貴。查看DecalBatch,瞭解您正在做的事情。它可以將所有矩形組合成一次繪製調用。 – Tenfour04

+0

但是'ModelBatch'' flush()'只有當它的緩衝區已滿時纔會刷新它們,所以它只會被髮送到GPU一次。同樣''DecalBatch',盡我所知,沒有做我所需要的,它在3D空間中繪製2D紋理,不是嗎? – Springrbua

+0

哦,是的,沒錯。你在使用混合嗎?你繪製了多少個矩形? DecalBatch可以繪製沒有紋理的實心矩形......您只需要一個自定義的GroupStrategy來設置它。這傢伙(http://www.badlogicgames.com/forum/viewtopic.php?f=11&t=12493&p=55804&hilit=decalbatch#p55804)發現DecalBatch和ModelBuilder對矩形具有相似的性能。 – Tenfour04

回答

1

ModelBuilder#createRect將爲每個矩形創建一個新模型。渲染模型實例(的一部分)時,它意味着繪製調用。因此,ModelBuilder#createRect效率極低。最好將多個矩形組合成單個(部分)模型。這可以使用:

modelBuilder.begin(); 
MeshPartBuilder mpb = modelBuilder.part(....); 
mpb.rect(...); // first rect. 
mpb.rect(...); // second rect. 
// etc. 
Model model = modelBuilder.end(); 

請注意,這仍然不足以滿足例如,一個體素引擎。如果您打算優化體素,您可能需要在自定義的RenderableProvider中構建網格(在平截頭體剔除和深度排序後)。這裏有一個例子:https://github.com/libgdx/libgdx/tree/master/tests/gdx-tests/src/com/badlogic/gdx/tests/g3d/voxel

+0

我剛剛開始使用'MeshPartBuilder',因爲我已經看到了我可以給它紋理的UV。非常感謝您的回答。這只是另一個小問題:如果我在整個左邊牆上創建一個'Model'。這是更有效率,然後渲染一些較小的部分(讓我們說4部分)與視錐截取? – Springrbua

+1

回答這個問題的唯一方法是基準測試,它依賴於太多的變量(頂點數,着色器複雜度,GPU等)。在大多數情況下,這些問題表明過早優化。在實踐中,最好使用常識,只有在遇到問題時才進行優化。例如。將可能在平截頭體中一起的靜態部分組合在一起,當一部分可能被剔除而另一部分不可被分割時,分割部分是相同的(重複的)並且可能被相互獨立地剔除。 – Xoppa

+0

非常感謝Xoppa這真的幫了很大忙。感謝您使用真棒且易於使用的3D API +幫助像我這樣的新手使用它:P保持它! – Springrbua