2015-08-28 68 views
0

我試圖將大量索引幾何體(如SphereGeometry)合併到單個緩衝區幾何體中。THREE.js:將索引幾何體合併到緩衝區幾何體

索引幾何圖形是我的'預製'。

首先,I「弄平」的預製的索引到一個這樣的數組:

var prefabFaceCount = prefabGeometry.faces.length; 

for (var i = 0; i < prefabFaceCount; i++) { 
    var face = prefabGeometry.faces[i]; 
    prefabIndices.push(face.a, face.b, face.c); 
} 

然後,我重複索引與針對每個預製偏移,像這樣:

var prefabIndexCount = prefabGeometry.faces.length * 3; 
var prefabVertexCount = prefabGeometry.vertices.length; 

for (var i = 0; i < prefabCount; i++) { 
    for (var k = 0; k < prefabIndexCount; k++) { 
     bufferIndices[i * prefabIndexCount + k] = prefabIndices[k] + i * prefabVertexCount; 
    } 
} 

這個工作正常,當我有少於65535面(prefabFaceCount * prefabCount),但是當我超過這個數字時,我的索引變得混亂,導致不正確的三角形。

這是不到65535個面孔 correct indices

這與以上(注意:在中心神器) incorrect indices

這是更加明顯,當我緩存更復雜的幾何形狀像SphereGeometries(球不應連接):

even more incorrect indices

我的猜測是,通過調用BufferGeometry.computeOffsets()將緩衝區幾何分塊爲偏移量時會發生問題。我已經嘗試了塊大小和索引排序的不同組合,但我還沒有找到解決方案。

我必須:緩衝指數

B)計算基於面部的數量在我的「預製」

c中的塊大小)時塊大小

一)帳戶做的一個組合和b

d)做別的事情完全

任何指針將不勝感激。

+0

[OES_element_index_uint(https://www.khronos.org/registry/webgl/extensions/OES_element_index_uint/) –

回答

1

索引屬性存儲在Uint16Array

標記Uint16不能引用到一個高於65535,因爲它會溢出位置(UINT16去只是爲2^16)

最簡單的是改變索引屬性緩衝到一個Uint32Array爲LJ建議

(瀏覽器需要支持OES_element_index_uint擴展,但大多數瀏覽器)

+0

謝謝。使用Unit32Array確實解決了這個問題(我忘記了我必須更改實際的數組聲明),但是我可能必須爲不支持該擴展的瀏覽器實施回退。計算正確的索引緩衝區大小/偏移量/索引...數字的方法是什麼? – vorsk

+0

簡單的方法是分割你的幾何體,每個只有65535個位置(所以位置屬性緩衝區長度小於65535 * 3) –

+0

困難的方法是自己合併緩衝區幾何體,以便只有索引高達65535,當你需要引用更高的位置時,你只需從該偏移量創建另一個drawcall,並從那裏開始索引,實際上創建多個繪製調用到webGL作爲具有更多的幾何形狀,太難以實現小性能獲得它通過您可以檢查擴展支持的方式帶來 –

相關問題