创建GLSL阵列的制服?

时间:2011-11-11 21:06:06

标签: arrays opengl glsl shader

我想留下OpenGL的灯光并制作自己的灯光。 我希望我的着色器允许可变数量的灯。

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

2 个答案:

答案 0 :(得分:80)

是的,这是可能的。你声明的统一数组类似于你在C中的表达方式,例如

uniform float v[10];

然后,您可以使用glUniform{1,2,3,4}{f,i}v

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

答案 1 :(得分:6)

是的,可以在GLSL着色器中声明一组制服。只是google“glsl uniform array”的一些例子(编辑:或者参见datenwolf的例子)。然而,有多少制服可以发送到不同的显卡(至少在较旧的显卡上,我不确定当前的显卡(尽管我认为仍然存在))。但

如果你决定走下制服的路线,我会建议使用统一的缓冲区。根据{{​​3}},“在统一缓冲区绑定之间切换通常比在程序中切换数十个制服更快”。

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