我想留下OpenGL的灯光并制作自己的灯光。 我希望我的着色器允许可变数量的灯。
我们可以在GLSL着色器中声明一组制服吗? 如果是这样,我们如何设定这些制服的价值呢?
答案 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}},“在统一缓冲区绑定之间切换通常比在程序中切换数十个制服更快”。
如果你有大量的灯光和参数,你也可以将数据作为浮动缓冲区发送。