2011-06-08 100 views
7

OpenGL SuperBible讨论纹理缓冲区对象,这些对象是由VBO内部数据形成的纹理。看起来使用它们有好处,但我发现的所有示例都创建了常规纹理。有没有人有什么建议关于何时使用其中一个?纹理缓冲区对象或常规纹理?

+0

总结一下基督徒所说的:TBOs是用于高级用途的。对于你通常所说的“纹理”(即图像),请使用glGenTextures&co。 – Calvin1602 2011-06-09 09:14:17

回答

8

根据extension registry,纹理缓冲区只有一维,不能进行任何过滤,并且必须通过访问显式纹理元素(通过索引)来访问,而不是使用标准化的[0,1]浮点纹理坐标。所以它们并不是真正的纹理替代品,而是大型的统一阵列(例如蒙皮矩阵或每个实例数据)。将它们与统一缓冲区进行比较,比对普通纹理进行比较更有意义,如完成here

编辑:如果您想要将VBO数据用于常规的,过滤的2D纹理,则不会绕过数据副本(最好通过PBO完成)。但是,如果您只是希望普通数组访问VBO数据并且属性不足以满足此要求,则纹理缓冲区应该是选择的方法。

编辑:检查在OpenGL超级相应章节后,我发现,他们一方面提,该纹理缓冲器总是1维和由离散的整数纹理像素偏移访问,但是,另一方面无法明确提到缺少过滤。在我看来,他们或多或少地将它们作为纹理进行宣传,只是从缓冲区获取数据,这解释了OP的问题。但如上所述,这只是错误的比较。纹理缓冲区只是提供了一种直接访问着色器中的缓冲区数据的方式(虽然有一个可调节的元素类型),但不是更多(使它们对普通纹理无用),但也不会少(它们仍然是一个很棒的功能)。

+0

这是完全错误的。那个exure支持1d,2d和3d纹理 – 2011-06-08 19:36:44

+0

@VJo不,你的评论是错误的。阅读链接的扩展规范以获取更多信息。也许你正在搞PBO的纹理缓冲区。 – 2011-06-08 19:52:06

+0

@VJo:缓冲区纹理是texels的一维数组,并且缓冲区纹理不支持mipmapping,具有标准化浮点纹理坐标的纹理查找以及任何类型的纹理过滤。顺便说一句,它是OpenGL 3.1+的一部分:http://www.opengl.org/sdk/docs/man3/xhtml/glTexBuffer.xml – Calvin1602 2011-06-09 09:08:41

0

当VBOs不受支持时使用常规纹理。

+0

这是错误的,因为纹理缓冲区不提供常规纹理的常用特征。 – 2011-06-08 22:45:35

+1

不能说这个答案是错误的,因为当硬件不支持特性(扩展)时,常规纹理总是可以用来模拟TexBO的行为。 – rotoglup 2011-06-08 23:42:55

+0

@rotoglup好的,如果从这一点来看,你可能是对的。 – 2011-06-09 01:00:26