基于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
的调用会累积之前传递给它们的所有文本进行编译,这与在源文件中添加额外字符串的前缀相同。
然后每次更改灯的数量时都需要重新编译,而不仅仅是提供制服。
在我编写的程序中,我必须生成多个光源并将其传递给着色器。由于此数字是在着色器外部定义的,因此我想通过 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
的调用会累积之前传递给它们的所有文本进行编译,这与在源文件中添加额外字符串的前缀相同。
然后每次更改灯的数量时都需要重新编译,而不仅仅是提供制服。