我正在使用webgl開發一款小遊戲。在這個遊戲中,我有一些由許多(100+)樹木物體組成的森林。因爲我只有幾個不同的樹模型,所以我在顯示它們之前以不同的方式旋轉和縮放這些模型。如何使用webgl實現批處理?
目前,我遍歷所有的樹來顯示它們:
for (var tree in trees) {
tree.display();
}
雖然樹的display()
方法是這樣的:
display : function() { // tree
this.treeModel.setRotation(this.rotation);
this.treeModel.setScale(this.scale);
this.treeModel.setPosition(this.position);
this.treeModel.display();
}
許多樹對象共享相同的treeModel
對象,所以我我必須在每次顯示模型前設置模型的旋轉/縮放/位置。每棵樹的旋轉/比例/位置值都不相同。
的treeModel
的顯示方法做了所有的GL東西:
display : function() { // treeModel
// bind texture
// set uniforms for projection/modelview matrix based on rotation/scale/position
// bind buffers
// drawArrays
}
所有樹模型使用相同的着色器,但可以使用不同的紋理。
由於一棵樹模型只包含幾個三角形,所以我想將所有樹合併成一個VBO並用一個drawArrays()
調用顯示整個森林。
一些假設,使談論比較容易的數字:
- 有250棵顯示
- 有5個不同的樹模型
- 每個樹模型有50個三角形
問題我有:
目前我有5個緩衝區,大小爲
50 * 3 * 8 (position + normal + texCoord) * floatSize
字節。當我想顯示所有樹與一個vbo我會有一個緩衝區與250 * 50 * 3 * 8 * floatSize
字節大小。我認爲我不能使用索引緩衝區,因爲我對每棵樹都有不同的位置值(由樹模型的位置值和樹的位置/比例/旋轉計算得出)。這是正確的還是仍然有一種方法可以使用索引緩衝區來至少減少緩衝區大小?也許有其他方法來優化這個?如何處理樹模型的不同紋理?我可以將所有紋理綁定到不同的紋理單元,但是如何在着色器中決定哪些紋理應該用於當前顯示的片段?
當我想在運行時向此緩衝區添加新樹(或任何其他類型的對象)時:是否必須創建新緩衝區並複製內容?我認爲無法使用
glMapBuffer
添加新值。它是否正確?
+1紋理圖集。此外,我不認爲WebGL(至少,Chrome在Mac OS上的實現,但可能的WebGL本身)支持陣列紋理。 – 2012-03-18 20:34:39
將多個紋理合併爲一個是個好主意。我會研究這一點。我也不知道索引限於65k。好信息,謝謝。 – micha 2012-03-18 21:20:09
由於用於索引元素的數據類型(Uint16Array),它被限制爲65k。 – MikaelEmtinger 2012-03-19 15:23:02