GLSL / C ++:制服arrays?

我想离开OpenGL的灯光,做我自己的。 我希望我的着色器允许可变数量的灯光。

我们可以在GLSL着色器中声明一系列的制服吗? 如果是的话,我们如何设定这些制服的价值呢?

是的,这是可能的。 你声明统一数组类似于你如何在C中做它,例如

uniform float v[10]; 

那么你可以使用glUniform{1,2,3,4}{f,i}v来设置它们的值

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

是的,可以在GLSL着色器中声明一组制服。 只是谷歌“glsl统一arrays”的一些例子(编辑:或见datenwolf的例子)。 然而,有多less制服可以发送到不同的graphics卡(至less在旧的,我不知道目前的(虽然我想还是会有))的限制。

如果你决定走下制服的路线,我会build议使用统一的缓冲区。 根据http://www.opengl.org/wiki/Uniform_Buffer_Object ,“在统一缓冲区绑定之间切换通常比在程序中切换几十个统一更快”。

如果你有大量的灯光和参数,你也可以发送数据作为浮动缓冲区。