【问题标题】:Different Types of Buffers on GPUGPU 上不同类型的缓冲区
【发布时间】:2014-07-12 15:36:39
【问题描述】:

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

那么为什么总是提供缓冲区类型作为参数很重要呢?每个 Buffer 是否都有保留的内存量?不同类型的 Buffers 的 Memory Locations 有区别吗?

【问题讨论】:

  • 我不是 openGL 专家,但通常不同类型的缓冲区可能需要不同的缓存访问(例如纹理)、迁移策略和/或执行低级内容(例如对齐),所有这些都需要一些有关如何使用该内存区域的更多“信息”。这在CUDA中是有效的,也许对于处理片上内存的openGL驱动也是如此。
  • 不确定您的意思,但可能同时绑定了多个缓冲区(例如 ARRAY 和 ELEMENTS_ARRAY) - 每种类型一个 - 并且您指定要使用其中的哪一个。

标签: c++ opengl


【解决方案1】:

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

话虽如此,标准还是保证了一些东西。一个问题是缓冲区不是“字符串类型的”。您不创建 VBO,而只是创建缓冲区。即使初始绑定目标是GL_ARRAY_BUFFER,您也可以将其用作VBO、IBO、PBO、UBO 或其他任何东西。您甚至可以同时将同一个缓冲区绑定到不同的目标,例如将顶点和元素索引放入同一个缓冲区。所以考虑到这一点,确实没有不同的缓冲区类型。绑定目标只是在缓冲区在使用时赋予语义意义。这也只是 GL 的标准绑定使用和绑定修改方法。

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

【讨论】:

    猜你喜欢
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多