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 ,“在统一缓冲区绑定之间切换通常比在程序中切换几十个统一更快”。
如果你有大量的灯光和参数,你也可以发送数据作为浮动缓冲区。