2012-04-19 49 views
3

這是一個相當WebGL的具體問題。我無法理解drawElement的WebGL特定實現。這是API規範。 From the WebGL specification如何使用WebGL drawElements偏移量?

我到底該如何使用偏移量?我可以使用偏移來模仿更經典的glDrawRangeElements嗎?

空隙drawElements(GLenum模式,GLsizei計數,GLenum類型,GLintptr偏移) (OpenGL ES 2.0的§2.8,手冊頁)

繪製使用當前綁定的元件陣列緩衝器。給定的偏移量以字節爲單位,並且必須是給定類型大小的有效倍數,否則會生成INVALID_OPERATION錯誤;請參閱緩衝區偏移量和步幅要求。如果count大於零,則必須將非空WebGLBuffer綁定到ELEMENT_ARRAY_BUFFER綁定點,否則將生成INVALID_OPERATION錯誤。

我有一個平坦的頂點數組和平板指數陣列,並使用一個drawElements繪製呼叫已經工作了很大,但現在我想單獨繪製頂點的部分,因爲它們是不同的對象。例如,索引[0]到索引[99]是一個對象(例如手臂),並且索引[100]到索引[149](例如腿)是另一個對象。這些組必須單獨繪製 - 最終因爲它們具有不同的紋理,並且我將在每個drawElements調用之前綁定紋理(也許還有另一種方法可以完成此操作嗎?)

因此,我想調用指數drawElements [ 0]到索引[99],以及索引[100]到索引[149]的drawElements。我可以用drawElements偏移量來做到這一點嗎?

隨着我在這裏的代碼,我可以很好地畫出第一組,但其餘的組不顯示出來。

for(var g = 0; g < groups.length; g++) { 
    var group = groups[g]; 

    //Set the texture 
    var material = group.material; 
    material.bindTexture(); 

    //Draw it! 
    var offset = group.offset; //index of the first element of the indices, (e.g. position '0' or position '100', from above) 
    var num_items = group.num_items; //number of items in this group, (e.g. '100' elements or '50' elements, from above) 
    gl.drawElements(draw_mode, num_items, indices.type, offset); 
} 

回答

3

文件說:

...給定的偏移量是在字節,大小必須與給定類型的 的一個有效的多...

如果indices.typegl.UNSIGNED_SHORT然後2個字節用於每個索引。

使用try offset * 2,而不是僅僅offset

gl.drawElements(draw_mode, num_items, indices.type, offset * 2); 
+0

那完美。謝謝,胡安!我還是比較新的StackOverflow。 =) – SharkCop 2012-04-19 21:37:56