13

在 GLSL 中进行多重纹理处理时,是否有一个可索引的采样器数组,其中每个纹理的大小不同?此语法无效:

uniform sampler2D texArray[5];

现在似乎唯一的选择是单独创建采样器:

uniform sampler2D tex1;
uniform sampler2D tex2;
uniform sampler2D tex3;
uniform sampler2D tex4;
uniform sampler2D tex5;

但是我无法遍历它们,这真是让人头疼。有解决办法吗?

4

2 回答 2

25

此语法无效:

谁说的?采样器数组肯定是有效的(取决于版本)。你如何使用它们是另一回事。

GLSL 1.20 及更低版本不允许采样器数组。

在 GLSL 1.30 到 3.30 中,您可以拥有采样器数组,但对索引有严格的限制。索引必须是一个整数常量表达式。因此,虽然您可以声明一个采样器数组,但您不能循环遍历它。

GLSL 4.00 及更高版本允许索引是“动态统一积分表达式”。该术语基本上意味着着色器的所有实例化(在同一个绘制调用中)必须获得相同的值。

因此,您可以在 GLSL 4.00+ 中循环遍历一个恒定范围,并使用循环计数器索引一个采样器数组。您甚至可以从统一变量中获取索引。您不能做的是让索引依赖于着色器阶段的输入(除非该值在渲染命令引起的所有实例中都相同),或者来自从纹理访问派生的值(除非该值是由渲染命令引起的所有实例都相同),或其他东西。

对放置在采样器数组中的纹理的唯一要求是它们与采样器类型匹配。所以你必须在数组GL_TEXTURE_2D的所有元素上使用 a 。sampler2D除此之外,纹理可以有任意数量的差异,包括大小。数组的存在是为了使编码更容易;它不会改变那里的语义。

请记住:采样器数组中的每个单独元素都需要绑定到自己的纹理图像单元。

于 2012-08-20T03:00:12.380 回答
2

无论如何都有一个可索引的采样器数组,其中每个纹理的大小不同?

还没有。也许这会被添加到以后的 OpenGL 版本中,但我对此表示怀疑。

但是我无法遍历它们,这真是让人头疼。有解决办法吗?

作为一种解决方法,您可以使用阵列纹理并仅使用每一层的子区域。使用一个 vec4 数组来存储每一层上每张图片的边界。

于 2012-08-20T00:16:50.780 回答