【问题标题】:OpenGL - Is it possible to use texture buffers with interleaved VBOs?OpenGL - 是否可以将纹理缓冲区与交错的 VBO 一起使用?
【发布时间】:2013-06-07 20:01:10
【问题描述】:

有没有一种方法可以只将 VBO 的单个属性绑定到纹理缓冲区对象?

问题是,我使用 交错 VBO 来绘制具有位置、半径和另一个属性的球体。现在,我想使用另一个着色器,它使用 instanced geometry 在我的球体 VBO 的位置​​绘制其他东西。 我能做的只是 texelFetch() 我需要的数据,这对于所需的对齐(VBO 属性具有不同的大小)和未使用的空间来说真的很难看,因为纹理缓冲区的大小有限,这很糟糕。另一种方法是只将我需要的数据从一个 VBO 复制到一个单独的 VBO,但这也不是很令人满意。

那么……还有其他可能吗?

【问题讨论】:

  • "还有未使用的空间,这很糟糕,因为纹理缓冲区的大小有限。" - 嗯?您知道纹理缓冲区不占用任何额外内存,它只是指向缓冲区数据的指针(您已经需要存储其完整数据)。同样,我不认为纹理缓冲区与底层缓冲区对象相比有任何明显的大小限制,它至少可以大 2^27 纹素,这将是大约 800 万个顶点如果使用 16 个属性(我猜你没有)。
  • 是的,我确实知道它不会占用额外的内存,但我不知道纹理缓冲区对象的实际最小大小。
  • 我从ARB_texture_buffer 扩展中获得了这个号码,但我真的想知道核心版本是否进一步限制了这一点。实际上,它们的大小是 优于普通 1D 纹理(我认为也是统一缓冲区)的优势之一。
  • 嗯,等一下,奇怪的是,OpenGL 3.3 规范仅列出了 64k 作为最小支持的最大纹理缓冲区大小,而 EXT_texture_buffer_object 扩展名表示大约 2^27(但随后也列出了 64k 作为最小值价值)。我猜 64k 是要支持的理论限制,而 2^27 是引入时的实际限制。

标签: opengl buffer textures vbo


【解决方案1】:

Buffer textures 没有属性。所以你说的没有意义。

此外,VBO 也不是一回事。没有“VBO”之类的东西。只是buffer objects 和它们的不同用途。 glVertexAttribPointer 不修改缓冲区对象。它只是告诉 OpenGL 的顶点读取系统如何从中获取数据。其他从缓冲区对象中获取数据的系统使用自己的机制来执行此操作,这些机制是完全独立的。

像缓冲纹理。

如果你想“使用实例化几何绘制其他东西”,为什么不直接use instancing?对这些属性应用除数(大概为 1),这样它们只会为不同的实例获得不同的值。

【讨论】:

  • glVertexAttribDivisor 看起来像我正在寻找的功能,但我真的不知道如何使用它。我有两个顶点缓冲区对象:#1 用于绘制几何图形的顶点数据,#2 用于位置等实例属性。所以我认为我应该做的只是声明没有除数的#1 的属性和带有除数的#2 的属性,并在着色器中添加位置。那是对的吗?而且我不需要纹理缓冲区对象?
  • 我并没有说缓冲区纹理具有属性。我只是想将单个属性的数据从另一个缓冲区对象绑定到纹理缓冲区对象。我可能不是很清楚。
  • @maumau: "所以我认为我应该做的只是声明没有除数的#1 的属性和带有除数的#2 的属性,然后在着色器中添加位置。 i>" 首先,这是一个全新的问题。您询问了缓冲区纹理和交错数据。如果您对如何使用实例化数组有疑问,可以使用“提问”按钮进行提问。其次,是的,这是一般的想法。是的,你不会使用缓冲纹理。
猜你喜欢
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 2012-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
相关资源
最近更新 更多