GLSL,不同大小的纹理数组

gri*_*ett 11 opengl glsl

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

uniform sampler2D texArray[5];
Run Code Online (Sandbox Code Playgroud)

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

uniform sampler2D tex1;
uniform sampler2D tex2;
uniform sampler2D tex3;
uniform sampler2D tex4;
uniform sampler2D tex5;
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*las 21

此语法无效:

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

GLSL 1.20及更低版本不允许采样器阵列.

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

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

因此,您可以在GLSL 4.00+中循环一个恒定范围,并使用循环计数器索引一个采样器数组.您甚至可以从统一变量中获取索引.什么,你不能做的是有指数依赖于输入到着色器级(除非该值是跨越引起渲染命令所有实例相同),或来自从纹理访问得到的值(除非该值在渲染命令引起的所有实例中都是一样的,或者某种东西.

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

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