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

Med*_*eda 2 opengl

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

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

GPU需要多少内存:

glBufferData(GL_ARRAY_BUFFER, 1000, NULL, GL_DYNAMIC_DRAW);
Run Code Online (Sandbox Code Playgroud)

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

glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(poly), &poly);  
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 5

GPU需要多少内存:

glBufferData(GL_ARRAY_BUFFER, 1000, NULL, GL_DYNAMIC_DRAW);
Run Code Online (Sandbox Code Playgroud)

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

我会假设你的问题是,"为缓冲区对象分配多少内存?"

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

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

glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(poly), &poly);  
Run Code Online (Sandbox Code Playgroud)

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

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

分配的大小不会改变.正如malloc在调用memcpy返回的指针时未更改返回的分配大小一样.glBufferData就像malloc; 它分配存储(可选择memcpy进入该存储).glBufferSubData就像memcpy; 它将数据复制到现有存储中.

就像你不能memcpy没有先分配一样,你不能先打电话glBufferSubData不打电话glBufferData.