我尝试渲染网格的多个示例,每个示例具有不同的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
类似。 - 使用常量索引1、2或3,
GL.GetActiveUniform
显示数组的大小分别增加到2、3或4,但GL.GetUniform
仍然只返回第一项,我得到一个InvalidOperation错误,没有呈现任何内容。 - 使用可变索引(即,
int i=0;
,然后是offsets[i]
),使uniform具有所需的大小16,但仍然只包含我上传的数组的第一个元素,并且我得到InvalidOperation + nothing rendered,即使i=0;
据我所知,这个问题是由GL.Uniform1
引起的,无论我传入什么数组,它都只上传第一个项目。我的理解是,OpenTK中的GL.Uniform1(int location, int count, float[] value)
对应于OpenGL函数glUniform1fv
,所以这可能是OpenTK的一个bug,或者我只是没有正确地执行它?
2条答案
按热度按时间ckocjqey1#
使用浮点数数组
GL.Uniform1
初始化uniform变量的工作符合预期(OpenTK 4.6.3):dohp0rv52#
我也有同样的问题。使用
GL.Uniform2()
函数而不是GL.Uniform1()
函数对我来说很有效。