Равномерный массив с переменным размером - PullRequest
0 голосов
/ 20 октября 2019

Мне нужно сделать шейдер с несколькими источниками света, который будет принимать количество источников света и использовать их в качестве размера для массива источников света

uniforn float numOfLights;
uniform vec3 lightPosition[numOfLights];

, но это возвращает меня к чему-то вроде: невозможно установить размер не постоянной переменной.

1 Ответ

0 голосов
/ 20 октября 2019

То, что вы пытаетесь сделать, невозможно. Размер массива должен быть целой константой.
Соответствующая часть в спецификации:

Язык затенения OpenGL, версия 4.60 - 4.1.9. Массивы

[...] Если в объявлении указан размер массива, это должно быть целочисленное константное выражение [...]


Если вам нужен буфер с переменным размером, вы должны использовать объект буфера хранилища шейдеров . В SSBO самая нижняя переменная в определении блока может иметь размер переменной.


В качестве альтернативы вы можете создать единый массив с определенным максимальным количеством элементов и просто использовать его часть. Например:

#define MAX_LIGHTS 8

uniforn float numOfLights;
uniform vec3 lightPosition[MAX_LIGHTS];

Обратите внимание, также возможно создать другую программу шейдера для разного количества источников света. Если количество источников света не изменяется динамически, это может быть правильным решением.

...