访问 GLSL 中隐式定义数组的索引

Accessing the index of an implicitly defined array in GLSL

我试图制作一个简单的纹理(片段)着色器,它将循环遍历隐式定义的统一数组 atextures[]。下面的代码returns下面的错误

代码:

#version 330 core

out vec4 FragColor;
in vec2 TexCoord;

uniform sampler2D atextures[];
uniform int textureLength;

void main()
{
    for (int i=0; i<textureLength; i++){
        FragColor = texture(atextures[i], TexCoord);
    }
} 

错误:

Indirect index into implicitly-sized array

然而,当我将索引从 i 更改为 0 时,以下编译正常。我是否设置了 for 循环错误?或者我是否正确初始化了数组?

您收到错误是因为您的代码违反了规范。查看(最近的)OpenGL Shading Language 4.60 Specification - 4.1.9. Arrays:

It is legal to declare an array without a size (unsized) and then later redeclare the same name as an array of the same type and specify a size, or index it only with constant integral expressions (implicitly sized).


您尝试做的不是创建一个隐式大小的数组,而是一个动态大小的数组。

无法创建大小可变的统一数组。 Shader Storage Block.
中最底部的变量只能有可变大小 无论如何,您应该更喜欢使用 sampler2DArray 而不是 sampler2D 的数组。使用采样器数组,您必须为每个元素使用单独的纹理单元,并且数组索引必须是 Dynamically uniform expression