Iphone 如何从顶点缓冲区对象绘制单个三角形并设置其颜色?

Iphone 如何从顶点缓冲区对象绘制单个三角形并设置其颜色?,iphone,ios,opengl,opengl-es,vbo,Iphone,Ios,Opengl,Opengl Es,Vbo,我创建了一个仅包含三角形顶点的顶点缓冲区对象,用于使用GL_三角形选项绘制。我的VBO没有颜色信息,因为我每帧都更改颜色 现在,在每次迭代中设置默认顶点颜色后,我尝试在循环中绘制单个三角形,如下所示: glColor4f(red, green, blue, 1); 但我不知道如何进行实际绘图 如果我想从VBO中选取一个或两个三角形以使用特定颜色绘制它们,我必须使用glDrawArrays,还是必须使用glDrawElements 有没有更有效的方法来设置VBO中每个三角形的颜色,然后绘制它?或

我创建了一个仅包含三角形顶点的顶点缓冲区对象,用于使用GL_三角形选项绘制。我的VBO没有颜色信息,因为我每帧都更改颜色

现在,在每次迭代中设置默认顶点颜色后,我尝试在循环中绘制单个三角形,如下所示:

glColor4f(red, green, blue, 1);
但我不知道如何进行实际绘图

如果我想从VBO中选取一个或两个三角形以使用特定颜色绘制它们,我必须使用
glDrawArrays
,还是必须使用
glDrawElements


有没有更有效的方法来设置VBO中每个三角形的颜色,然后绘制它?或者在每个帧的循环中调用
glColor44
glDrawArrays
可以吗?

首先,我建议忽略稍高的内存开销,只在VBO中存储每个顶点的颜色,因此只需为每个三角形的顶点复制三角形的颜色(不能设置每个三角形的颜色)。这可能比在循环中绘制单个三角形效率更高。请记住,VBOs的优势不仅在于其可能的GPU存储,而且您不需要为每个三角形甚至顶点调用驱动程序。因此,只需将每个三角形的颜色复制为每个顶点的颜色,然后绘制所有内容只需一次调用
glDrawArrays
glDrawElements
如果您需要复制几乎所有顶点,将不会为您带来太多好处,这使得索引毫无用处)

也就是说,您当然可以使用
glDrawArrays
绘制单个三角形,这就是
第一个
计数
参数的用途。因此,如果您有一个包含3个三角形的9个顶点的VBO,只需调用

glDrawArrays(GL_TRIANGLES, 3, 3);

只画第二个三角形。这很简单。同样,你可以使用
gldrawerelements
count
offset
参数来选择索引数组中要绘制的特定部分。

太好了!非常感谢!所以基本上我会继续创建一个带有交错顶点颜色的结构数组-(...)数据,然后glMapBufferOES+memcpy在每一帧中将颜色发送到GPU。在循环中为每一种颜色、每一帧调用memcpy有多痛苦?这是不是与交错数据的折衷?否则,如果不是交错的话,我可以在每一帧调用一次memcpy,每次调用一大块颜色。你认为更好吗?@openfrog难以回答回答:因为交错可能更好。但是你是对的,更新整个内存块而不是许多分散的内存块也可能更好。在这种情况下,你甚至可以将位置放在一个VBO中,将颜色放在另一个VBO中,这样你就可以更新整个颜色VBO,这同样具有一些性能优势(如果操作正确)过度更新一个部件。我想它需要测试。使用两个VBO是有意义的。这需要使用索引吗?@openfrog否,为什么要这样做?只需在调用
glBindBuffer
)之前绑定正确的VBO(使用
gl…Pointer
)。索引用于索引绘图。如果您不想要/需要索引,请不要使用索引。