繁体   English   中英

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

[英]What is the proper way to upload a uniform array to a shader using 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]);
}

我正在使用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] ),导致制服具有所需的 16 大小,但仍然只包含我上传的数组的第一个元素,并且我得到 InvalidOperation + 没有渲染, 即使 i=0;

据我所知,问题是由GL.Uniform1仅上传第一项引起的,无论我传入什么数组。我的理解是 OpenTK 中的GL.Uniform1(int location, int count, float[] value)对应到 OpenGL function glUniform1fv ,所以这可能是 OpenTK 的错误还是我根本没有正确执行?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM