纹理缓冲对象还是普通纹理?

8

OpenGL SuperBible讨论了纹理缓冲对象,它们是从VBO内部数据形成的纹理。看起来使用它们有好处,但我找到的所有示例都创建常规纹理。有人对何时使用其中一种而不是另一种有什么建议吗?


简而言之,Christian所说的是:TBOs是用于高级应用的。对于您通常所称的“纹理”(即图像),请使用glGenTextures和其他函数。 - Calvin1602
3个回答

8
根据扩展注册表,纹理缓冲区仅为一维,不能进行任何过滤,并且必须通过访问显式纹素(按索引)而非标准化的[0,1]浮点纹理坐标来访问。因此,它们并不真正替代常规纹理,而是用于大型统一数组(例如蒙皮矩阵或每个实例数据)。将它们与常规纹理进行比较比与统一缓冲区进行比较更有意义,就像这里所做的那样。 编辑:如果您想使用VBO数据进行常规的过滤二维纹理,那么您将无法避免数据复制(最好通过PBO完成)。但是,当您只需要对VBO数据进行简单的数组访问且属性不足以满足此需求时,纹理缓冲区应该是首选方法。 编辑:在查看《超级宝典》中相应章节后,我发现他们一方面提到纹理缓冲区始终是1维的,并通过离散整数texel偏移量进行访问,但另一方面未明确提到缺乏过滤。在我看来,他们更多地将其宣传为仅从缓冲区获取数据的纹理,这解释了OP的问题。但正如上面提到的,这只是错误的比较。纹理缓冲区只是提供了一种直接访问着色器中缓冲区数据的方式,以普通数组的形式呈现(虽然具有可调元素类型),不多也不少(对于常规纹理而言它们是无用的),但仍然是一个很棒的功能。

这完全是错误的。该扩展支持1D、2D和3D纹理。 - BЈовић
@VJo 不,你的评论是错误的。阅读链接的扩展规范以获取更多见解。也许你把纹理缓冲区和PBO搞混了。 - Christian Rau
@VJo:缓冲纹理是一维的texel数组,并且缓冲纹理不支持mipmapping、使用标准化浮点纹理坐标进行纹理查找以及任何类型的纹理过滤。顺便说一下,这是OpenGL 3.1+的一部分:http://www.opengl.org/sdk/docs/man3/xhtml/glTexBuffer.xml - Calvin1602
第一个链接让我感到困惑,因为它提到了1D、2D和3D纹理。你的第二次编辑回答了这个问题。Calvin的链接更好地解释了纹理缓冲是什么。 - BЈовић
@VJo 第一个链接(扩展规范)使用了 Calvin 在他的评论中使用的确切词语。阅读扩展规范的概述通常比规范补充更能提供深入的见解,因为它们经常相当零散并脱离上下文。 - Christian Rau
有进行过性能比较吗?两者都在图形内存上,不是吗? - Amir Zadeh

1
缓冲纹理是一种独特的纹理类型,允许像纹理一样从着色器中访问缓冲对象。它们与普通的OpenGL纹理完全不同,包括Texture1D、Texture2D和Texture3D。使用缓冲纹理而不是普通纹理有两个主要原因:
  • 由于Texture Buffers可以像纹理一样读取,因此可以使用texelFetch自由地从每个顶点读取其内容。这是使用顶点属性所无法实现的,因为那些只能按顶点进行访问。
  • 当需要传递大量数据数组时,Buffer Textures可作为uniforms的替代品。Uniforms的大小受限,而Buffer Textures可以非常庞大。
  • Buffer Textures在较旧版本的OpenGL中得到支持,而Shader Storage Buffer Objects(SSBO)不支持GPU,则可以用作回退方案。

与此同时,OpenGL中的普通纹理工作方式不同,专门用于实际贴图。具有以下特点,与Texture Buffers不同:

  • 常规纹理可以应用过滤器,因此当您在着色器中对其进行像素采样时,您的GPU将根据附近的像素自动插值颜色。这可以防止在大幅放大纹理时出现像素化,尽管它们会逐渐变得更模糊。
  • 常规纹理可以使用mipmaps,这是相同纹理的较低质量版本,用于更远的视距。OpenGL具有内置的功能来生成mipmaps,或者您可以提供自己的mipmaps。 mipmaps对于大型3D场景中的性能可能有所帮助。 mipmaps还可以帮助防止在更远处呈现的纹理闪烁。

总结这些要点,您可以说普通纹理适用于实际纹理,而缓冲区纹理适用于传递原始值数组的方法。


0

当VBO不被支持时,使用常规纹理。


这是错误的,因为纹理缓冲区不提供常规纹理的通常功能。 - Christian Rau
1
无法说答案是错误的,因为当硬件不支持该特性(扩展)时,常规纹理始终可以用来模拟TexBO的行为。 - rotoglup
@rotoglup 好的,如果从那个角度来看,你可能是对的。 - Christian Rau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接