glBufferData实际上是根据现场大小分配内存吗?

时间:2013-02-15 20:44:35

标签: opengl

我想知道,如果我使用glBufferData,它会在我调用它时准确分配内存(也就是说,如果size参数超过可用内存,那么它会崩溃)或者是否有一些一种特殊的即时规则,只有当我实际将数据复制到缓冲区时才分配内存?

为了使其更简洁,我的问题将通过回答一个更实际的问题来回答:

GPU需要多少内存:

glBufferData(GL_ARRAY_BUFFER, 1000, NULL, GL_DYNAMIC_DRAW);

然后,当你在同一个缓冲区上执行此操作时,占用的内存将如何变化:

glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(poly), &poly);  

2 个答案:

答案 0 :(得分:5)

  

GPU需要多少内存:

glBufferData(GL_ARRAY_BUFFER, 1000, NULL, GL_DYNAMIC_DRAW);

无法保证这会在GPU上分配任何内存。驱动程序可能决定将缓冲区对象放在CPU内存而不是GPU中。

我会假设您的问题是“为缓冲区对象分配多少内存?”

1000个字节。这就是你要求的,而这就是驱动程序将分配的内容。

  

然后,当你在同一个缓冲区上执行此操作时,占用的内存将如何变化:

glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(poly), &poly);  

如果当前绑定到GL_ARRAY_BUFFER的缓冲区对象已为其分配了存储空间,并且该存储包含至少sizeof(poly)个字节,那么它将通过复制第一个{{1}来修改缓冲区的存储空间从sizeof(poly)到存储的字节。

如果没有分配存储空间,或者存储空间小于&poly字节,则会出现sizeof(poly)错误。

分配的大小未更改。正如在您返回的指针上调用GL_INVALID_VALUE时,malloc返回的分配大小不会更改。 memcpy就像glBufferData;它分配存储(malloc选项到该存储中)。 memcpy就像glBufferSubData;它将数据复制到现有的存储中。

就像你没有先分配memcpy一样,如果不先调用memcpy,就无法致电glBufferSubData

答案 1 :(得分:1)

来自the docs

  如果GL无法使用指定的GL_OUT_OF_MEMORY创建数据存储,则会生成

size

此外:

  

如果dataNULL,则仍会创建指定大小的数据存储,但其内容仍未初始化,因此未定义。