2

我想知道,如果我使用glBufferData,它会在我调用它时准确地分配内存(也就是如果 size 参数大于可用内存,那么它会崩溃)还是它有某种特殊的及时规则仅当我实际将数据复制到缓冲区时才分配内存?

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

这将占用 GPU 上的多少内存:

glBufferData(GL_ARRAY_BUFFER, 1000, NULL, GL_DYNAMIC_DRAW);

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

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

2 回答 2

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)字节,那么它将通过将第一个sizeof(poly)字节复制到存储空间中来修改缓冲区的存储&poly空间。

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

分配的大小没有改变。就像调用返回的指针malloc时,返回的分配大小不会改变一样。就像; 它分配存储(可以选择进入该存储)。就像; 它将数据复制到现有存储中。memcpyglBufferDatamallocmemcpyglBufferSubDatamemcpy

就像你不能不memcpy先分配一样,你不能不先调用glBufferSubData就调用glBufferData

于 2013-02-15T21:14:21.097 回答
1

文档

GL_OUT_OF_MEMORY如果 GL 无法使用指定的size.

还:

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

于 2013-02-15T20:46:46.177 回答