我想留下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着色器中声明一组制服。只是google“glsl uniform array”的一些例子(编辑:或者参见datenwolf的例子)。然而,有多少制服可以被发送到不同的显卡(至少在较旧的显卡上,我不确定当前的显卡(虽然我想仍然会有))。
如果你决定沿着制服的路线走下去,我会建议使用统一的缓冲区。根据http://www.opengl.org/wiki/Uniform_Buffer_Object的说法,“在统一缓冲区绑定之间切换通常比在程序中切换数十个制服更快”。
如果您有大量的灯光和参数,您也可以将数据作为浮动缓冲区发送。