我希望自己制作着色器中的灯光,不使用OpenGL的灯光。 我想让我的着色器能够容纳可变数量的灯光。
我们能否在GLSL着色器中声明一个uniform数组? 如果可以,我们该如何设置这些uniform的值?
uniform float v[10];
然后,您可以使用glUniform{1,2,3,4}{f,i}v
设置它们的值。
GLfloat v[10] = {...};
glUniform1fv(glGetUniformLocation(program, "v"), 10, v);
i
的布尔值和使用1i
的不透明度)。如果你说1f
,那么统一变量必须是1个浮点数。否则,将导致“GL_INVALID_OPERATION”。” - Nicol BolasglUniform
这样的函数中,{1234}
表示uniform变量的类型。例如,1f代表单个浮点数,2i代表ivec2等等。这不应与函数使用的第二个参数count
混淆,该参数表示数组大小。因此,要上传到uniform vec2 vecs [5];
,应使用glUniform2fv(loc,5,data);
。 - legends2kGlint result; glGetIntegerv(GL_MAX_UNIFORM_LOCATIONS, 0, &result)
即可。 - rwols