GPU上不同类型的缓冲区

时间:2014-07-12 15:36:39

标签: c++ opengl

在进行OpenGL时,我们不断定义我们正在处理的缓冲区类型。即使OpenGL Superbible说缓冲区没有真正的类型,因为它们只是"缓冲区",有人必须始终提供缓冲区类型。

那么为什么始终提供缓冲区类型作为参数很重要?每个缓冲区都有预留的内存量吗?内存位置与不同类型的缓冲区不同吗?

1 个答案:

答案 0 :(得分:2)

嗯,这里有不同的方面需要考虑。首先,OpenGL只是一个API规范,它不会强制执行内部实现的方式 - 它适用于任何特定的内存和缓存架构等。

话虽如此,标准仍然保留了一些东西。并且一个问题是缓冲区不是"字符串类型"。你不是创建VBO,而只是一个缓冲区。即使初始绑定目标是GL_ARRAY_BUFFER,您也可以将其用作VBO,IBO或PBO,UBO或其他任何版本。您甚至可以同时将相同的缓冲区绑定到不同的目标,例如将vertex和elemnt索引放入同一个缓冲区。所以考虑到这一点,确实没有不同的缓冲区类型。绑定目标只是在使用时为缓冲区赋予语义含义。这也是GL的标准绑定使用和绑定到修改方法。

然而,那个操作系统只有故事的一半。你可以做这些事情的事实并不意味着实际做这些事情是个好主意。任何明智的GL实现都会在创建缓冲区时使用缓冲区目标和使用提示,作为决定放置缓冲区的基础 - 进入客户端RAM,进入某个GPU映射的GART区域,进入VRAM(如果有特定的东西)实现)。因此,如果您在创建缓冲区时不使用缓冲区,则实际上会对GL实现的优化起作用,或者在没有充分理由的情况下对相同的缓冲区使用相同的缓冲区。结果,性能可能没那么好。