访问 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
我试图制作一个简单的纹理(片段)着色器,它将循环遍历隐式定义的统一数组 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