我遇到了一个示例OpenGL代码,我移植到OpenGL ES 2.0(实际上没有太多工作要做),但我不禁想知道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);
也就是说,我可以通过在glBufferData
中使用指向四元数组的有效指针来省略glVertexAttribPointer
函数。
那么,任何人都可以解释glBufferData
函数的含义吗?从我正在做的事情看来似乎是多余的,但这必定是因为我严重缺乏对API的了解。事实上,我尝试在khronos.org阅读文档,但这并没有帮助我理解它的使用。
答案 0 :(得分:16)
如果您在多个帧中重复使用相同的数据,则在设置/初始化过程中使用glBufferData
只会将数据从CPU传输到GPU一次。而每帧必须调用glVertexAttribPointer
,因此使用它来传输数据会导致使用更多的总线带宽。
如果你每帧更新一次属性数组,那么这种方式就没那么大了。
答案 1 :(得分:5)
这很奇怪。如果省略glBufferData的工作原理是相同的,那么要么没有绑定缓冲区,要么在程序中先前有一个glBufferData调用。我很困惑OpenGL ES是否有一些显着不同的“特殊行为”,但我检查了规格,从我所看到的,它与“普通”OpenGL完全相同。
如果没有缓冲区被绑定(客户端内存),则绘图(通过glDraw [Elements | Arrays])将从glVertexAttribPointer先前提供的指针读取。如果绑定了缓冲区,它将从缓冲区读取,将glVertexAttribPointer指针参数视为缓冲区中的偏移量。显然没有定义从尚未初始化的缓冲区中绘制。
glBufferData做什么?
glBufferData至少做两件事,可选择做第三件事。它分配缓冲区存储并规定缓冲区的使用。 (可选)如果指针参数为非null,则它将使用指向的数据填充缓冲区。类似的glBufferSubData不同之处在于它只更新(可能是子范围)数据,它不分配存储或其他任何东西。