Opengl es 什么';s';glBufferData';在OpenGL ES中的应用程序?

Opengl es 什么';s';glBufferData';在OpenGL ES中的应用程序?,opengl-es,Opengl Es,我遇到了一个移植到OpenGL ES 2.0的示例OpenGL代码(实际上没有太多工作要做),但我不禁想知道glBufferData函数的作用是什么。原始来源如下: glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 2 * 6, quad, GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(GLfl

我遇到了一个移植到OpenGL ES 2.0的示例OpenGL代码(实际上没有太多工作要做),但我不禁想知道
glBufferData
函数的作用是什么。原始来源如下:

glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 2 * 6, quad, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 2, (void *) 0);
但我可以成功地将其简化为:

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 2, quad);
也就是说,只要在
glvertexattributepointer
中使用指向四元数组的有效指针,我就可以省略
glBufferData
函数


那么,谁能解释一下
glBufferData
函数的作用是什么?从我现在所做的来看,这似乎是多余的,但这一定是因为我严重缺乏API知识。事实上,我尝试在上阅读文档,但这并不能帮助我理解它的用途。

如果在多个帧中重复使用相同的数据,在设置/初始化过程中使用
glBufferData
将只将数据从CPU传输到GPU一次。而
glvertexattributepointer
必须在每一帧调用,因此使用它传输数据会导致使用更多的总线带宽


如果每帧更新一次属性数组,这样或那样都没有什么好处。

这很奇怪。如果省略glBufferData的效果相同,那么要么没有绑定缓冲区,要么在程序的前面有一个glBufferData调用。我不知道OpenGL ES是否有一些明显不同的“特殊行为”,但我检查了规范,从我所看到的,它的工作原理与“正常”OpenGL完全相同

如果绑定了no缓冲区(客户端内存),则绘图(通过glDraw[Elements | Arrays])将从先前由GLVERTEXAttributePointer提供的指针读取。如果绑定了,它将从缓冲区读取,并将glVertexAttributePointer指针参数视为缓冲区中的偏移量。显然,未定义从尚未初始化的缓冲区中进行绘图

glBufferData做什么


glBufferData至少做两件事,还可以选择做第三件事。它分配缓冲区存储并规定缓冲区的使用。或者,如果指针参数为非null,它将用指向的数据填充缓冲区。类似的glBufferSubData的不同之处在于它只更新(可能是一个子范围)数据,不分配存储或其他任何内容。

Aha!我正在开发类似于图像处理API的东西,这样顶点就不会改变(更不用说只有六个顶点了)。谢谢!非常感谢!问题不在于调用glVertexAttribPointer(事实上,您使用偏移量0来调用它)。关键思想是,使用glBufferData可以在“快速内存”(即GPU可以直接访问的RAM)中创建数据的工作副本,而不必在内存域(即CPU)之间传输顶点属性→ 每次调用glDrawElements或GLDrawArray时。这还意味着,在复制到“快速”内存后,您可以使用程序中的数据释放内存。
glBufferData
只有在实例化几何体时才真正有用,对吗?如果要在不同的位置绘制模型50次,请调用一次
glBufferData
,然后执行变换和
glDrawArrays
等。但是如果要绘制50个不同的模型,则必须为每个模型调用
glBufferData
,或者跳过它并将顶点数据传递到
glvertexattributepointer
?或者,您可以将所有顶点数据合并到一个数组中,在该数组上调用
glBufferData
,然后将单独的偏移量传递到
glvertexattributepointer
,我想这是最快的方法?@Soup:VBO有助于从同一数据多次绘制。可以是实例,也可以是后续帧。是的,建议将多个模型连接到一个VBO中,因为绑定新的VBO比更改偏移量成本更高。@BenVoigt我正在使用OpenGL 2.0程序来显示同一对象的多个实例/副本您知道任何教程/示例吗,任何帮助都将不胜感激。除了答案中所说的,我相信您在这里寻找的概念的名称是顶点缓冲区对象(VBO):