Объявление массива в GLSL на основе единого целого

В программе, которую я кодирую, мне нужно сгенерировать несколько источников света и передать их шейдеру. Поскольку это число определено за пределами шейдера, я хочу пропустить его через uniform int и используйте это, чтобы объявить размер массивов.

uniform int numLights;
uniform vec4 ambientColor;
uniform vec4 specularColor;
uniform vec3 diffuseColor[numLights];
uniform vec3 vLightPosition[numLights];

Однако сейчас я получаю много ошибок:

введите описание изображения здесь

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

0

Решение

GLSL следует правилу C, что размеры массивов должны быть известны во время компиляции.

GLSL имеет препроцессор, но не имеет средств для предоставления значений препроцессора, кроме как в виде исходного кода. Так что вам нужно сгенерировать подходящий #define заявления в виде строк и поставьте их glShaderSource до предоставления источника для этого шейдера — вызовы glShaderSource накапливать весь текст, переданный им до компиляции, это то же самое, что префикс дополнительных строк в вашем исходном файле.

Затем вам нужно будет перекомпилировать каждый раз, когда вы меняете количество источников света, а не просто предоставлять униформу.

1

Другие решения


По вопросам рекламы [email protected]