基于uniform int在GLSL中声明数组

时间:2015-05-26 17:50:57

标签: c++ arrays opengl glsl uniform

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

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

然而,我现在遇到很多错误:

enter image description here

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

1 个答案:

答案 0 :(得分:1)

GLSL遵循C规则,必须在编译时知道数组大小。

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

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