GLSL,不同大小的纹理数组

时间:2012-08-19 23:10:03

标签: opengl glsl

在GLSL中进行多重纹理时,无论如何都有一个可转换的采样器数组,其中每个纹理的大小不同?此语法无效:

uniform sampler2D texArray[5];

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

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

但是后来我无法迭代它们,这对屁股来说真的很痛苦。有解决方案吗?

2 个答案:

答案 0 :(得分:21)

  

此语法无效:

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

GLSL 1.20及以下版本不允许采样器阵列。

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

GLSL 4.00及以上版本允许索引为“dynamically uniform integral expression”。该术语基本上意味着着色器的所有实例化(在同一个绘制调用中)必须获得相同的值。

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

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

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

答案 1 :(得分:1)

  

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

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

  

但是后来我无法迭代它们,这对屁股来说真的很痛苦。有解决方案吗?

作为一种解决方法,您可以使用Array Textures并仅使用每个图层的子区域。使用vec4数组存储每层图片的boudaries。