具有可变大小的统一数组

问题描述 投票:1回答:1

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

uniforn float numOfLights;
uniform vec3 lightPosition[numOfLights];

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

glsl shader
1个回答
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];

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

© www.soinside.com 2019 - 2024. All rights reserved.