dat*_*olf 84
是的,这是可能的.你声明的统一数组类似于你在C中的表达方式,例如
uniform float v[10];
Run Code Online (Sandbox Code Playgroud)
然后您可以使用设置它们的值 glUniform{1,2,3,4}{f,i}v
GLfloat v[10] = {...};
glUniform1fv(glGetUniformLocation(program, "v"), 10, v);
Run Code Online (Sandbox Code Playgroud)
是的,可以在GLSL着色器中声明一组制服.只是google"glsl uniform array"的一些例子(编辑:或者参见datenwolf的例子).然而,有多少制服可以被发送到不同的显卡(至少在较旧的显卡上,我不确定当前的显卡(虽然我想仍然会有)).
如果你决定沿着制服的路线走下去,我会建议使用统一的缓冲区.根据http://www.opengl.org/wiki/Uniform_Buffer_Object,"在统一缓冲区绑定之间切换通常比在程序中切换数十个制服更快".
如果您有大量的灯光和参数,您也可以将数据作为浮动缓冲区发送.