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

Wal*_*ter 2 opengl buffer textures glsl

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

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

uniform sampler2d texture[30];
Run Code Online (Sandbox Code Playgroud)

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

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

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

void createTBO(GLuint* tbo, GLuint* tex)
Run Code Online (Sandbox Code Playgroud)

通过执行该方法

glTexBufferEXT(GL_TEXTURE_BUFFER_EXT, GL_RGBA32F_ARB, *tbo);  
Run Code Online (Sandbox Code Playgroud)

一个人实际上可以将纹理附加到缓冲区.这也在这里提到.我假设一个接一个地调用glTexBuffer 30次之后就不会这么做了.

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

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

所以,我的问题是:

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

如果你能给我建议,我将不胜感激.就OpenGL而言,我真的是一个新手.

谢谢沃尔特

Mat*_*gro 10

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

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