GLSL / C++: массивы униформы?
Я хотел бы оставить огни OpenGL и сделать свой собственный. Я хотел бы, чтобы мои шейдеры учитывали переменное количество огней.
можем ли мы объявить массив униформы в шейдерах GLSL? Если да, то как бы мы определили значения этих форм?
2 ответа:
Да, это возможно. Вы объявляете однородные массивы, подобные тому, как вы это делаете в C, например
uniform float v[10];
затем вы можете установить их значения с помощью
glUniform{1,2,3,4}{f,i}v
GLfloat v[10] = {...}; glUniform1fv(glGetUniformLocation(program, "v"), 10, v);
да можно объявить массив униформ в шейдерах GLSL. Просто google "GLSL uniform array" для некоторых примеров (edit: или см. Пример datenwolf). Однако есть ограничения на то, сколько униформ можно отправить на разные графические карты (по крайней мере, на более старых, я не уверен в текущих (хотя я предполагаю, что все еще будет)).
Если вы все же решите пойти по пути униформы, я бы предложил использовать равномерные буферы. В соответствии с http://www.opengl.org/wiki/Uniform_Buffer_Object, "переключение между равномерными буферными привязками обычно происходит быстрее, чем переключение десятков униформ в программе".
Если у вас есть большое количество света и параметров, вы также можете отправить данные в буферы поплавок.