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

OpenGL 3.3、GLSL 1.5:如何设置包含各种纹理2D的纹理缓冲区对象?,opengl,buffer,glsl,textures,Opengl,Buffer,Glsl,Textures,我一直在想,在GLSL 1.5顶点着色器中是否可能有一个sampler2D数组 我需要从顶点着色器访问30种不同的2d纹理。我读到不可能有这样的结构: uniform sampler2d texture[30]; 然而,有30种不同的制服有点夸张,而且很难管理 所以,这让我想到了拥有一个纹理缓冲对象。自OpenGL 3.0以来,就支持TBO。然而,我找不到一个好的教程或示例,分别展示了如何使用一个纹理和多个纹理初始化TBO 该网站展示了一个关于如何用单一纹理初始化TBO的示例。没什么大不了的。

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

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

uniform sampler2d texture[30];
然而,有30种不同的制服有点夸张,而且很难管理

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

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

void createTBO(GLuint* tbo, GLuint* tex)
通过执行该方法

glTexBufferEXT(GL_TEXTURE_BUFFER_EXT, GL_RGBA32F_ARB, *tbo);  
实际上可以将纹理附加到缓冲区。也提到了这一点。我想一个接一个地调用glTexBuffer 30次不会奏效

所以,我一直在想,是否有其他方法可以得到同样的结果。我想出了两个主意:

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

  • 如何设置包含多个纹理的TBO
  • 那有可能吗
  • 你知道我在哪里可以找到关于将2d纹理添加到3d纹理的信息吗
  • 你知道我可以在哪些网站上找到有关sampler2DArray的初始化、绑定和使用的信息吗
如果你能给我建议,我将不胜感激。就OpenGL而言,我真的是个新手

谢谢
Walter

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


如果纹理大小相同,则可以使用3D纹理或纹理阵列。TBO对你的问题没有用。

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

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


纹理_buffer _object.txt

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

这听起来很有趣。走,沃尔特!«我需要从顶点着色器访问30种不同的2d纹理。»这不是TBO的用途。它们只是来自缓冲区对象的一维数据数组。您需要的是纹理阵列。阅读本规范中的glTexImage3D和GLSL规范中的textureArray2D采样器。