OpenGL 3.3,GLSL 1.5:如何设置包含各种texture2D的纹理缓冲区对象?

时间:2010-12-09 01:49:25

标签: opengl buffer glsl textures

我一直想知道是否有可能在GLSL 1.5顶点着色器中有一个sampler2D数组。

我需要从顶点着色器访问30种不同的2d纹理。我读到不可能有这样的结构:

uniform sampler2d texture[30];

然而,有30种不同的制服有点夸张而且难以管理......

所以,这让我想到了一个纹理缓冲对象。自OpenGL 3.0以来支持TBO。但是,我找不到一个好的教程或示例,分别展示了如何使用一个纹理而不是几个纹理来初始化TBO。

This网站显示了如何使用单个纹理初始化TBO的示例。没什么大不了的。我认为最重要的方法是

void createTBO(GLuint* tbo, GLuint* tex)

执行方法

glTexBufferEXT(GL_TEXTURE_BUFFER_EXT, GL_RGBA32F_ARB, *tbo);  

实际上可以将纹理附加到缓冲区。这也提到here。我假设一个接一个地调用 glTexBuffer 30次就不会做了。

所以,我一直在想是否有另一种方法可以获得相同的结果。我提出了两个想法:

  • 将30个2d纹理添加到3d纹理并将其直接附加到顶点着色器。然而,这将是对内存的大量浪费,因为大多数3d纹理的层都不会被使用。
  • 使用名为sampler2DArray的结构。它在规格中提到。但是,我在网上搜索过,找不到有关如何实现这一点的任何有价值的信息。

所以,我的问题是:

  • 如何设置包含超过1个纹理的TBO?
  • 这有可能吗?
  • 您是否知道我可以找到有关向3d纹理添加2d纹理的信息的来源?
  • 您是否了解我可以找到有关sampler2DArray初始化,绑定和使用情况的信息的网站?

如果你能给我建议,我将不胜感激。我真的是OpenGL方面的新手。

由于 沃尔特

3 个答案:

答案 0 :(得分:10)

我相信你误解了纹理缓冲对象(TBO)是什么。 TBO用于访问着色器内的缓冲区对象,仅此而已。它不包含多个纹理或类似的东西。

如果纹理大小相同,则可以使用3D纹理或纹理数组。 TBO对您的问题毫无用处。

答案 1 :(得分:2)

你可以使用sampler2DArray制服。您可以使用它们将多个纹理传递到着色器。

http://www.opengl.org/registry/specs/EXT/texture_array.txt

另一种解决方案是使用非常大的tbo并将所有纹理存储在tbo中。纹理可以大到11585x11585像素(2 ^ 27)

texture_buffer_object.txt

答案 2 :(得分:1)

正如Jotschi建议使用一个非常大的纹理并相应地调整纹理坐标。 (或:写一个将标准坐标映射到正确位置的着色器) 这就是所谓的纹理图集。我猜你可以通过搜索这个术语找到一些实现。