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

问题描述 投票:0回答:2

我正在尝试渲染网格的多个实例,每个实例都有不同的

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 函数
glUniform1fv
,所以可以这样吗是 OpenTK 的错误还是我根本没有正确执行?

c# opengl opentk
2个回答
0
投票

使用带有

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);

0
投票

我也有同样的问题。 GL.Uniform2() 而不是 GL.Uniform1() 对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.