问题描述
我正在尝试渲染网格的多个实例,每个实例都有不同的 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];