大小可变的统一数组

时间:2019-10-20 11:43:31

标签: glsl shader

我需要制作多光源着色器,该着色器可以容纳多个灯光并将其用作灯光阵列的大小

uniforn float numOfLights;
uniform vec3 lightPosition[numOfLights];

但这会给我类似的信息:无法将大小设置为非常量变量。

1 个答案:

答案 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];

注意,还可以为不同数量的光源创建不同的着色器程序。如果光源的数量没有动态变化,这可能是一个合适的解决方案。