我想知道,如果我使用glBufferData
,它会在我调用它时准确分配内存(也就是说,如果size参数超过可用内存,那么它会崩溃)或者是否有一些一种特殊的即时规则,只有当我实际将数据复制到缓冲区时才分配内存?
为了使其更简洁,我的问题将通过回答一个更实际的问题来回答:
GPU需要多少内存:
glBufferData(GL_ARRAY_BUFFER, 1000, NULL, GL_DYNAMIC_DRAW);
然后,当你在同一个缓冲区上执行此操作时,占用的内存将如何变化:
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(poly), &poly);
答案 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
。
此外:
如果
data
为NULL
,则仍会创建指定大小的数据存储,但其内容仍未初始化,因此未定义。