标签: buffer-objects

你能用一个VBO多个目标吗?

示例代码:

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"绑定它.绑定似乎有两个目的:

  1. 在我们将数据复制到GPU之前,我们必须绑定缓冲区 glBufferData
  2. 我们必须先绑定缓冲区才能通过它添加属性 glVertexAttribPointer

而且我认为这是你需要绑定VBO的唯一两次.我的问题是,是否存在第2和第3行的目标(GL_ARRAY_BUFFER,GL_ELEMENT_ARRAY_BUFFER,GL_PIXEL_PACK_BUFFER或GL_PIXEL_UNPACK_BUFFER)不同的情况?或者我们想要在第4行之前将其重新绑定到不同的目标?

我们可以将多个缓冲区目标绑定到单个VBO吗?

opengl vbo buffer-objects

6
推荐指数
1
解决办法
4441
查看次数

在调用glDeleteBuffers之前,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)

删除前取消绑定是好的还是坏的做法?

opengl buffer-objects

5
推荐指数
1
解决办法
3010
查看次数

glBufferSubData 什么时候返回?

我想将非常大的内存块的内容传输到足够大的 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 传输操作中的行为是否相同。

opengl dma buffer-objects

2
推荐指数
1
解决办法
191
查看次数

标签 统计

buffer-objects ×3

opengl ×3

dma ×1

vbo ×1