创建GLSL阵列的制服?

Mil*_*les 65 arrays opengl shader glsl

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

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

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)

  • @bobobobo:"*所以从技术上讲,你可以使用glUniform1fv(uniformId,4,v)设置一个统一的vec4;其中v是一个包含4个浮点数的数组.*"不,你不能.规范非常明确:大小和类型*必须*匹配制服的大小和类型(除了使用`i`的bool和使用`1i`的opa).如果你说'1f`,那么制服必须是1浮点数.否则,"GL_INVALID_OPERATION"接着发生. (12认同)
  • 在像`glUniform`这样的函数中,@ MilesRufat-Latre` {1234}`讲述了统一变量的类型.1f表示单个浮点数,2i表示ivec2,依此类推.这不应该与函数采用的第二个`count`参数混淆,后者是数组大小.所以要上传到`uniform vec2 vecs [5];`,它是`glUniform2fv(loc,5,data);`. (6认同)
  • 1,2,3,4指的是什么?这是否意味着我只能将数组的值设置为最多四个成员? (2认同)
  • @Asad-ullahKhan:不,因为 C 数组到指针的衰减。 (2认同)

Nic*_*kLH 5

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

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

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

  • 谷歌搜索"glsl制服阵列"现在返回此页作为第一个结果!! 我们现在干什么? (77认同)
  • @mlvljr我们进入一个递归循环,直到Stack Overflows.(得到它?) (11认同)
  • 统一缓冲区对象仅在GL 3.1版之后可用.从版本2.0开始,需要ARB_Uniform_Buffer_Object扩展. (6认同)
  • 我用谷歌搜索并进入了这个页面。在回答时更好地提前计划这样的结果:) (3认同)