2017-07-16 50 views
1

我想爲我的多邊形實現一個詳細算法級別到我的3d引擎。我得到的是以下幾點:OpenGL的實現詳細程度

的多數量的多邊形實體,如:

House: 

1. -Entity1: 10000 polygons   viewrange[0,100] 
2. -Entity1: 5000 polygons   viewrange[100,300] 
3. -Entity1: 800 polygons   viewrange[300,1000] 
4. -Entity1: 100 polygons   viewrange[1000,infinity] 

通常情況下,我將創建一個新VAO包括VBO的每一個實體,而是有沒有更聰明的方式來實現這一點?我是否可以只使用一個單獨的VAO,並通過更改索引緩衝區來調整詳細程度?

我創建了一個例子。我目前正在處理地形網格,需要將LoD應用於它們:

不同索引緩衝區的示例,但是如何交換它們?這是否有效?

在OpenGL中實現LoD的最佳方式是什麼?我需要多個VAO還是足夠一個VAO?

回答

1

您可以同時將數據和索引信息存儲在一個VAO中。如果將所有索引組合在一個緩衝區中,則可以通過指定draw命令中的開始索引和索引量來調整要繪製的級別。

對於你的榜樣,你會通過調用創建一個索引緩衝帶30個指數,其中指數0-5是1級,6-29 2級,您可以再畫1級:

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); 

和2級致電:

glDrawElements(GL_TRIANGLES, 24, GL_UNSIGNED_INT, (void*)(6 * sizeof(GLuint))); 

注意,這種方法需要你有存儲所有的水平在所有的時間。這可能取決於你的需求,而不是你想要的。

+0

聽起來不錯。但是如果我有最高LOD在256x256頂點附近的地形網格,什麼方法會更有效率?你仍然會把它們全部保存在一個緩衝區中,或者開始使用多個VAO? – Luecx

+1

如果我有一個由規則網格組成的地形,那麼我將使用曲面細分着色器進行動態鑲嵌。特別是對於地形,無論如何你都需要更多的細節。關於多個VAO:最後歸結爲:您是想在開始時加載所有數據,還是想在不需要時從內存中加載和刪除內存級別? – BDL

+0

我可能會生成地形程序。但我還不確定。它會產生很大的變化嗎? – Luecx