创建GLSL阵列的制服?

问题描述 投票:62回答:2

我想留下OpenGL的灯光,然后自己做。我希望我的着色器允许可变数量的灯光。

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

arrays opengl glsl shader
2个回答
82
投票

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

uniform float v[10];

然后你可以使用glUniform{1,2,3,4}{f,i}v设置它们的值

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

6
投票

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

如果你决定沿着制服的路线走下去,我会建议使用统一的缓冲区。根据http://www.opengl.org/wiki/Uniform_Buffer_Object的说法,“在统一缓冲区绑定之间切换通常比在程序中切换数十个制服更快”。

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

© www.soinside.com 2019 - 2024. All rights reserved.