我正在尝试渲染网格的多个实例,每个实例都有不同的
float
偏移量。为此,我将一个统一的浮点数组传递给着色器,然后将使用 gl_InstanceID
进行索引。但我收到 InvalidOperation 错误,并且没有呈现任何内容。我的顶点着色器的相关行如下。
#version 150
uniform float offsets[16]; //Uniform array declaration.
// Other uniforms
void main () {
// Other code to assign gl_Position.
// ...
// Assigning the value to the vertex colour for debugging purposes.
col = vec3(offsets[gl_InstanceID]);
}
我正在使用
offsets
将数组 GL.Uniform1(location, offsets.Length, offsets);
上传到着色器
经过一些实验,我发现了以下几点:
offsets[0]
而不是 offsets[gl_InstanceID]
可以工作并且渲染网格,但是 GL.GetActiveUniform
显示数组的大小为 1,并且 GL.GetUniform
仅返回数组的第一个元素。 float[]
的功能类似于 float
。GL.GetActiveUniform
显示数组的大小已分别增加到 2,3 或 4,但 GL.GetUniform
仍然只返回第一项,我收到 InvalidOperation 错误并且没有渲染任何内容.int i=0;
然后 offsets[i]
),导致制服具有所需的大小 16,但仍然只包含我上传的数组的第一个元素,并且我得到 InvalidOperation + 没有任何渲染,甚至当i=0时;据我所知,问题是由
GL.Uniform1
只上传第一个项目引起的,无论我传入什么数组。我的理解是 OpenTK 中的 GL.Uniform1(int location, int count, float[] value)
对应于 OpenGL 函数 glUniform1fv
,所以可以这样吗是 OpenTK 的错误还是我根本没有正确执行?
使用带有
GL.Uniform1
的浮点数组初始化统一变量按预期工作(OpenTK 4.6.3):
uniform float offsets[16];
int offsetsLoc = GL.GetUniformLocation(program, "offsets");
GL.UseProgram(program);
var offsets = new float[16] { ... };
GL.Uniform1(offsetsLoc, offsets.Length, offsets);
我也有同样的问题。 GL.Uniform2() 而不是 GL.Uniform1() 对我有用。