opengl 使用OpenTK上传统一数组到着色器的正确方法是什么?

huus2vyu  于 2023-10-18  发布在  其他
关注(0)|答案(2)|浏览(131)

我尝试渲染网格的多个示例,每个示例具有不同的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,或者我只是没有正确地执行它?

ckocjqey

ckocjqey1#

使用浮点数数组GL.Uniform1初始化uniform变量的工作符合预期(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);
dohp0rv5

dohp0rv52#

我也有同样的问题。使用GL.Uniform2()函数而不是GL.Uniform1()函数对我来说很有效。

相关问题