使用 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]);
}

我正在使用 offsets 将数组 GL.Uniform1(location,offsets.Length,offsets); 上传到着色器 经过一些实验,我得出了以下结论:

  • 使用 offsets[0] 而不是 offsets[gl_InstanceID] 可以工作并呈现网格,但 GL.GetActiveUniform 显示数组的大小为 1,而 GL.GetUniform 仅返回数组的第一个元素大批。 float[]功能上的行为类似于 float
  • 使用 1,2 或 3 的常量索引,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 函数 { {1}},所以这可能是 OpenTK 的一个错误,还是我没有正确操作?

解决方法

使用带有 webdata = open("full_blacklist_database.txt") print (webdata) mydict = {} for line in webdata: if not line.startswith("#") and not line.startswith("\n"): keyspaced,valuespaced = line.split("#") #strip() wont remove the tabs key = keyspaced.strip().replace('\t',"") value = valuespaced.replace('\n',"") value2 = value.split(",") date = value2.pop(0) value2.insert(0,key) mydict[date] = value2 print(mydict) searchModule(mydict) 的浮点数组初始化统一变量按预期工作(OpenTK 4.6.3):

GL.Uniform1
uniform float offsets[16];