纹理缓冲对象还是常规纹理?

时间:2011-06-08 15:13:13

标签: opengl graphics textures

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

3 个答案:

答案 0 :(得分:8)

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

编辑:如果您想将VBO数据用于常规的,过滤的2D纹理,您将无法绕过数据副本(最好通过PBO完成)。但是当你只想要对VBO数据进行普通数组访问时,属性就不足以满足要求,那么纹理缓冲区应该是首选方法。

编辑:在检查SuperBible中的相应章节后,我发现他们一方面提到,纹理缓冲区始终是1维的,并且可以通过离散整数纹素偏移来访问,但是另一方面没有明确提到缺乏过滤。在我看来,他们或多或少地将它们作为纹理宣传,只是从缓冲区中获取数据,这解释了OP的问题。但如上所述,这只是错误的比较。纹理缓冲区只是提供了一种直接访问着色器中缓冲区数据的方式,以简单数组的形式(虽然具有可调节的元素类型),而不是更多(使它们对常规纹理无用),但也不是更少(它们仍然是一个很好的功能) )。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

缓冲区纹理是唯一的纹理类型,它允许从着色器(如纹理)访问缓冲区对象。它们与普通的OpenGL纹理(包括Texture1D,Texture2D和Texture3D)完全不同。使用缓冲区纹理而不是普通纹理的主要原因有两个:

  • 由于纹理缓冲区的读取方式与纹理相同,因此您可以使用texelFetch从每个顶点自由读取其内容。对于顶点属性,这是您不能做的,因为只能在每个顶点的基础上访问它们。
  • 当需要传递大量数据时,
  • 缓冲区纹理可以用作制服的替代方法。制服的大小有限,而“缓冲区纹理”的大小可能很大。
  • 在较早版本的OpenGL中,比“着色器存储缓冲区对象”(SSBO)支持“缓冲区纹理”,如果GPU上不支持SSBO,则它们可以很好地用作备用。

同时,OpenGL中的常规纹理的工作方式有所不同,并且是为实际纹理设计的。这些具有纹理缓冲区不共享的以下功能:

  • 常规纹理可以应用滤镜,以便在着色器中对它们进行采样时,GPU会根据附近的像素自动对颜色进行插值。尽管纹理会逐渐变得越来越模糊,但这可以防止在纹理大量放大时出现像素化。
  • 常规纹理可以使用mipmap,mipmap是在更远的视图距离处使用的同一纹理的较低质量版本。 OpenGL内置了生成mipmap的功能,或者您可以提供自己的功能。 Mipmap对在大型3D场景中的表现可能会有所帮助。 Mipmap还可以帮助防止在较远处渲染的纹理中闪烁。

总而言之,您可以说普通纹理对实际纹理很有用,而缓冲区纹理则可以作为传入原始值数组的一种方法。