2014-06-26 74 views
0

我试图用DrawRangeElements函数绘制,但由于某些原因,它没有绘制出一部分元素。DrawRangeElements没有正确绘制

例如,我有156分。我的每个元素包含52个点(3个元素x 52点= 156点)。

考虑这样的代码:

 //points contains 156 points 
     float[] points = new float[] { 
     1f, 2f, 3f, // 0 
     //.........   //refers to first element 
     4f, 5f, 5f, //51 

     6f, 7f, 8f, //52 
     //.........   //refers to second element 
     9f, 10f, 11f, //103 

     6f, 7f, 8f, //104 
     //.........   //refers to third element 
     9f, 10f, 11f, //155 
     }; 

随着DrawElements一切工作正常。

var indices1 = Enumerable.Range(0, 52).Select(i => (uint)i).ToArray(); 
    var indices2 = Enumerable.Range(52, 52).Select(i => (uint)i).ToArray(); 
    var indices3 = Enumerable.Range(104, 52).Select(i => (uint)i).ToArray(); 

    GL.DrawElements(PrimitiveType.QuadStrip, 52, DrawElementsType.UnsignedInt, indices1); 
    GL.DrawElements(PrimitiveType.QuadStrip, 52, DrawElementsType.UnsignedInt, indices2); 
    GL.DrawElements(PrimitiveType.QuadStrip, 52, DrawElementsType.UnsignedInt, indices3); 

DrawRangeElements我effors失败。三个元素中只有一个正在绘制。

 var indices = Enumerable.Range(0, 156).Select(i => (uint)i).ToArray(); 

     GL.DrawRangeElements(PrimitiveType.QuadStrip, 0, 51, 52, DrawElementsType.UnsignedInt, indices); 
     GL.DrawRangeElements(PrimitiveType.QuadStrip, 52, 103, 52, DrawElementsType.UnsignedInt, indices); 
     GL.DrawRangeElements(PrimitiveType.QuadStrip, 104, 155, 52, DrawElementsType.UnsignedInt, indices); 

如何与DrawRangeElements我可以画我的3个元素?

回答

3

你误解了glDrawRangeElements()的作用。

呼叫

glDrawRangeElements(primtype, count, a, b, dtype, offsst; 

被渲染相同数据

glDrawElements(primtype, count, dtype, offset); 

无论什么ab设置为。当你对GL说谎你将要使用的范围时,你会得到未定义的 行为。你在这里做的是绘制相同的52个顶点3次,在后两个调用中有无效的范围参数。

glDrawRangeElements()只是一个性能优化。您指定的范围定义了索引数组中的最小值和最大值。所以你向GL保证你只能访问顶点数组(和VBO)的一部分,但不能访问元素数组的一部分。 GL可以利用这些知识进行一些优化(例如,如果在绘图调用之后更新缓冲区的另一部分,则GL会知道它可以安全地执行此操作,而无需等待绘制调用完成)。

如果你想使用元素数组的不同部分,只需要使用不同的偏移量(或者指针,就你而言,因为你似乎使用客户端数组)。但是,我不知道为什么你使用glDrawElements()可言,因为glDrawArrays会出您的方案牛年,也避免abogus枚举阵列创建这样的需求:

GL.DrawArrays(PrimitiveType.QuadStrip, 0, 52); 
GL.DrawArrays(PrimitiveType.QuadStrip, 52, 52); 
GL.DrawArrays(PrimitiveType.QuadStrip, 104, 52);