我一直想知道是否有可能在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次就不会做了。
所以,我一直在想是否有另一种方法可以获得相同的结果。我提出了两个想法:
所以,我的问题是:
如果你能给我建议,我将不胜感激。我真的是OpenGL方面的新手。
由于 沃尔特
答案 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建议使用一个非常大的纹理并相应地调整纹理坐标。 (或:写一个将标准坐标映射到正确位置的着色器) 这就是所谓的纹理图集。我猜你可以通过搜索这个术语找到一些实现。