基于uniform int在GLSL中声明数组

Declaring array in GLSL based on uniform int

在我编写的程序中,我必须生成多个光源并将其传递给着色器。由于此数字是在着色器外部定义的,因此我想通过 uniform int 传递它并使用它来声明数组大小。

uniform int numLights;
uniform vec4 ambientColor;
uniform vec4 specularColor;
uniform vec3 diffuseColor[numLights];
uniform vec3 vLightPosition[numLights];

但是,我现在遇到了很多错误:

我做不到吗?问题是,我正在考虑更改预定义灯光数量的可能性,并忘记更新着色器,例如。我试图阻止这种情况发生。

GLSL 遵循那里的 C 规则,数组大小必须在编译时已知。

GLSL 有一个预处理器,但除了源代码之外无法提供预处理器值。因此,您需要生成合适的 #define 语句作为字符串,并在为该着色器提供源代码之前将它们提供给 glShaderSource - 对 glShaderSource 的调用会累积之前传递给它们的所有文本进行编译,这与在源文件中添加额外字符串的前缀相同。

然后每次更改灯的数量时都需要重新编译,而不仅仅是提供制服。