[英]What is the proper way to upload a uniform array to a shader using OpenTK?
我正在尝试渲染网格的多个实例,每个实例都有不同的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]);
}
我正在使用GL.Uniform1(location, offsets.Length, offsets);
将数组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 function 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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.