我需要制作多光源着色器,该着色器可以容纳多个灯光并将其用作灯光阵列的大小
uniforn float numOfLights;
uniform vec3 lightPosition[numOfLights];
但这会给我类似的信息:无法将大小设置为非常量变量。
答案 0 :(得分:0)
您无法执行的操作。数组大小必须是整数常量。
规范中的相关部分是:
The OpenGL Shading Language, Version 4.60 - 4.1.9. Arrays
[...]在声明中指定数组大小时,它必须是整数常量表达式[...]
如果要使用可变大小的缓冲区,则必须使用Shader Storage Buffer Object。在SSBO中,块定义中最底部的变量可以是可变大小。
或者,您可以创建一个具有定义的最大元素数量的统一数组,并仅使用其中的一部分。例如:
#define MAX_LIGHTS 8
uniforn float numOfLights;
uniform vec3 lightPosition[MAX_LIGHTS];
注意,还可以为不同数量的光源创建不同的着色器程序。如果光源的数量没有动态变化,这可能是一个合适的解决方案。