Подтвердить что ты не робот

GLSL/С++: массивы униформ?

Я бы хотел оставить огни OpenGL и сделать свой собственный. Я хотел бы, чтобы мои шейдеры разрешали переменное количество огней.

Можно ли объявить массив униформ в шейдерах GLSL? Если да, то как бы мы установили значения этих униформ?

4b9b3361

Ответ 1

Да, это возможно. Вы объявляете единые массивы, похожие на то, как вы это сделаете в C, например.

uniform float v[10];

Затем вы можете установить свои значения с помощью glUniform{1,2,3,4}{f,i}v

GLfloat v[10] = {...};
glUniform1fv(glGetUniformLocation(program, "v"), 10, v);

Ответ 2

Да, можно объявить массив униформ в шейдерах GLSL. Просто google "glsl равномерный массив" для некоторых примеров (отредактируйте или посмотрите пример datenwolf). Тем не менее существуют ограничения на то, сколько униформ может быть отправлено на разные видеокарты (по крайней мере, на старших, я не уверен в текущих (хотя, я думаю, все еще будет)).

Если вы решите пойти по пути униформы, я бы предложил использовать однородные буферы. Согласно http://www.opengl.org/wiki/Uniform_Buffer_Object, "Переключение между равномерными привязками буфера обычно быстрее, чем переключение десятков униформ в программу".

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