在OpenGL ES中有什么'glBufferData'?

Alb*_*ore 12 opengl-es

我运行了一个示例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);
Run Code Online (Sandbox Code Playgroud)

但我可以成功地将其简化为:

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 2, quad);
Run Code Online (Sandbox Code Playgroud)

也就是说,我可以glBufferData通过使用指向四元数组的有效指针来省略该函数glVertexAttribPointer.

那么,任何人都可以解释它的glBufferData功能是什么?从我正在做的事情看来似乎是多余的,但这必定是因为我严重缺乏对API的了解.事实上,我尝试在khronos.org上阅读文档,但这并不能帮助我理解它的用法.

Ben*_*igt 16

如果您在多个帧中重复使用相同的数据,则在glBufferData设置/初始化过程中使用一次只会将数据从CPU传输到GPU.虽然glVertexAttribPointer每帧必须调用,但使用它来传输数据会导致使用更多的总线带宽.

如果您每帧都更新属性数组,那么这种方式的优势并不多.

  • 问题不在于对glVertexAttribPointer的调用(实际上你用偏移量0调用它).关键的想法是,使用glBufferData创建"快速内存"中的数据的工作副本(即GPU可直接访问的RAM),而不必在内存域(即CPU→GPU)之间传输顶点属性每次调用glDrawElements或glDrawArrays时.这也意味着在复制到"快速"内存后,您可以使用程序中的数据释放内存. (4认同)

Dam*_*mon 5

这很奇怪.如果省略glBufferData的工作原理是相同的,那么要么没有绑定缓冲区,要么在程序中先前有一个glBufferData调用.我很困惑OpenGL ES是否有一些显着不同的"特殊行为",但我检查了规格,从我所看到的,它与"普通"OpenGL完全相同.

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

glBufferData有什么作用?

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