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


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

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

2 57

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, "переключение между равномерными буферными привязками обычно происходит быстрее, чем переключение десятков униформ в программе".

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