Создание массивов униформ GLSL? - PullRequest
62 голосов
/ 12 ноября 2011

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

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

Ответы [ 2 ]

81 голосов
/ 12 ноября 2011

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

uniform float v[10];

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

GLfloat v[10] = {...};
glUniform1fv(glGetUniformLocation(program, "v"), 10, v);
6 голосов
/ 12 ноября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...