从缓冲区中绘制不同长度的LINE_LOOP

时间:2014-05-28 09:34:39

标签: opengl-es buffer webgl draw

我有很多Polylgons。一个包含不同数量的点。 我在2d(正交)中使用LINE_LOOP绘制它们。

现在我想将它们全部上传到一个缓冲区。 问题是当我使用glDrawArrays绘制缓冲区时,第一个多边形的最后一个点通过线连接到下一个点,即第二个多边形的第一个点,依此类推。

我知道glDrawElements我可以发送索引并解决问题。但为此,我需要发送分配数据以分配多边形点,并将LINE_LOOP更改为LINES。

有没有办法只用每个多边形的起点和终点索引绘制?

例如

// My 2d polygons points are 
polygons = [ 
  0,0,   10,0,  10,5, 5,10,      // polygon 1
  20,20, 30,20, 30,30            // polygon 2
]

// First polygon is starting at 0, the second at index 8
// If there was function like this
draw(polygons, [0, 8]);

------ ADDITION -----------------

我们可以通过调用glDrawMultiArray在OpenGL中完成 - 感谢棘手的回答。

但是在WebGL中这个功能不存在。还有其他选择吗?

2 个答案:

答案 0 :(得分:1)

您可以使用glMultiDrawArrays

starts=[0,4,...]
counts=[4,3,...]

glMultiDrawArrays(GL_LINE_LOOP, starts, counts, starts.length);

否则使用glDrawElements可以指定基元重启索引

glEnable(GL_PRIMITIVE_RESTART);
glPrimitiveRestartIndex(65535);
index = [0,1,2,3,65535,4,5,6,65535,...]

//bind and fill GL_ELEMENT_ARRAY_BUFFER​
glDrawElements(GL_LINE_LOOP, index.size, GL_UNSIGNED_INT, 0);
//will draw lines `0,1 1,2 2,3 3,0 4,5 5,6 6,4`

答案 1 :(得分:0)

使用WebGL,AFAIK对应ES 2.0功能,我认为没有办法进行多次绘制调用。对于您的示例,您需要两个绘制调用:

glDrawArrays(GL_LINE_LOOP, 0, 8);
glDrawArrays(GL_LINE_LOOP, 8, 6);

您可以使用GL_LINES代替GL_LINE_LOOP将其缩减为单个绘制调用,但这意味着您的顶点数组会变大两倍,因为您需要每行的起点和终点段。

如果使用与GL_LINES组合的索引缓冲区,只要缓冲区中的顶点数不超过64k,则增加率仅为50%。顶点数组本身保持其原始大小,并且每个顶点还需要两个GL_UNSIGNED_SHORT个索引。所以每个顶点多4个字节,在8个字节(对于2个浮点数)的顶部,你有顶点坐标。对于有限的ES 2.0功能集,这可能是您的最佳选择。