我需要制作多盏灯光着色器,该着色器可以容纳多个灯光并将其用作灯光阵列的大小
uniforn float numOfLights;
uniform vec3 lightPosition[numOfLights];
但是这会给我类似:无法将大小设置为非常量变量。
您尝试做的事是不可能的。数组大小必须是整数常数。规范中的相关部分是:
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];
注意,也可以为不同数量的光源创建不同的着色器程序。如果光源的数量没有动态变化,这可能是一个合适的解决方案。