В программе, которую я кодирую, мне нужно сгенерировать несколько источников света и передать их шейдеру. Поскольку это число определено за пределами шейдера, я хочу пропустить его через uniform int
и используйте это, чтобы объявить размер массивов.
uniform int numLights;
uniform vec4 ambientColor;
uniform vec4 specularColor;
uniform vec3 diffuseColor[numLights];
uniform vec3 vLightPosition[numLights];
Однако сейчас я получаю много ошибок:
Разве я не могу это сделать? Дело в том, что я думал о возможности изменить количество предопределенных источников света и забыть обновить, например, шейдер. Моя попытка состояла в том, чтобы предотвратить это.
GLSL следует правилу C, что размеры массивов должны быть известны во время компиляции.
GLSL имеет препроцессор, но не имеет средств для предоставления значений препроцессора, кроме как в виде исходного кода. Так что вам нужно сгенерировать подходящий #define
заявления в виде строк и поставьте их glShaderSource
до предоставления источника для этого шейдера — вызовы glShaderSource
накапливать весь текст, переданный им до компиляции, это то же самое, что префикс дополнительных строк в вашем исходном файле.
Затем вам нужно будет перекомпилировать каждый раз, когда вы меняете количество источников света, а не просто предоставлять униформу.