这将占用 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
时,返回的分配大小不会改变一样。就像; 它分配存储(可以选择进入该存储)。就像; 它将数据复制到现有存储中。memcpy
glBufferData
malloc
memcpy
glBufferSubData
memcpy
就像你不能不memcpy
先分配一样,你不能不先调用glBufferSubData
就调用glBufferData
。