【发布时间】: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