我运行了一个示例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每帧必须调用,但使用它来传输数据会导致使用更多的总线带宽.
如果您每帧都更新属性数组,那么这种方式的优势并不多.
这很奇怪.如果省略glBufferData的工作原理是相同的,那么要么没有绑定缓冲区,要么在程序中先前有一个glBufferData调用.我很困惑OpenGL ES是否有一些显着不同的"特殊行为",但我检查了规格,从我所看到的,它与"普通"OpenGL完全相同.
如果没有绑定缓冲区(客户端内存),则绘图(通过glDraw [Elements | Arrays])将从glVertexAttribPointer先前提供的指针读取.如果绑定了缓冲区,它将从缓冲区读取,将glVertexAttribPointer指针参数视为缓冲区中的偏移量.显然没有定义从尚未初始化的缓冲区中绘制.
glBufferData有什么作用?
glBufferData至少做两件事,可选择做第三件事.它分配缓冲区存储并规定缓冲区的使用.(可选)如果指针参数为非null,则它将使用指向的数据填充缓冲区.类似的glBufferSubData不同之处在于它只更新(可能是子范围)数据,它不分配存储或其他任何东西.
| 归档时间: |
|
| 查看次数: |
11371 次 |
| 最近记录: |