2012-04-19 82 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