我有很多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中这个功能不存在。还有其他选择吗?
答案 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功能集,这可能是您的最佳选择。