示例代码:
1. glGenBuffers(1, &VboId);
2. glBindBuffer(GL_ARRAY_BUFFER, VboId);
3. glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
4. glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
Run Code Online (Sandbox Code Playgroud)
所以我们生成一个通用的VBO句柄,然后使用"GL_ARRAY_BUFFER"绑定它.绑定似乎有两个目的:
glBufferDataglVertexAttribPointer而且我认为这是你需要绑定VBO的唯一两次.我的问题是,是否存在第2和第3行的目标(GL_ARRAY_BUFFER,GL_ELEMENT_ARRAY_BUFFER,GL_PIXEL_PACK_BUFFER或GL_PIXEL_UNPACK_BUFFER)不同的情况?或者我们想要在第4行之前将其重新绑定到不同的目标?
我们可以将多个缓冲区目标绑定到单个VBO吗?
是否需要在删除之前取消绑定缓冲区对象?如果我将它绑定在VAO中并将其删除而不解除绑定(绑定到0),会发生什么?参考文献是否仍然存在?
public void dispose()
{
glBindVertexArray(0);
glDeleteVertexArrays(vaoID);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glDeleteBuffers(vboVertID);
glDeleteBuffers(vboColID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glDeleteBuffers(eboID);
}
Run Code Online (Sandbox Code Playgroud)
删除前取消绑定是好的还是坏的做法?
我想将非常大的内存块的内容传输到足够大的 GPU 缓冲区,然后立即更改 CPU 上的内存内容。在伪代码中是这样的:
glBindBuffer(/*very_large_buffer*/);
glBufferSubData(/*very_large_memory_chunk*/);
memset(/*zeros*/, /*very_large_memory_chunk*/);
Run Code Online (Sandbox Code Playgroud)
在这段代码中,glBufferSubData实际上做了什么?它是否在返回之前将 very_large_memory_chunk 传输到某个地方,还是只是安排传输操作以供稍后执行?因此,如果我立即开始更改 CPU 缓冲区,是否可能会传输部分更改的内存,从而在 GPU 的 very_large_buffer 中产生垃圾?
请注意,我不是在询问渲染调用。我知道如果缓冲区用于渲染,传输操作将等到渲染完成,反之亦然。我想知道 OpenGL 在 CPU 到 GPU 传输操作中的行为是否相同。