0

通常,问题在标题中。

我无法理解如何使用GetActiveUniform函数。

public void GetActiveUniform(uint program, 
                             uint index, 
                             int bufSize, 
                             int[] length, 
                             int[] size, 
                             uint[] type, 
                             string name);

我的尝试看起来像这样(一切都被编译和链接):

        int[] numberOfUniforms = new int[1];
        Gl.GetProgram(programId, ProgramParameter.ActiveUniforms, numberOfUniforms);

        int[] uniformNameMaxLength = new int[1];
        Gl.GetProgram(programId, ProgramParameter.ActiveUniformMaxLength, uniformNameMaxLength);

        int unifromCount = numberOfUniforms[0];

        for (uint i = 0; i < unifromCount; i++)
        {
            var uniformSize = new int[1];
            var unifromLength = new int[1];
            var uniformType = new uint[1];
            string uniformName = "";

            Gl.GetActiveUniform(programId, i, uniformNameMaxLength[0], unifromLength, uniformSize, uniformType, uniformName);
        }

顶点着色器:

#version 150 core

in vec3 in_Position;
out vec3 pass_Color;
uniform vec3 color;

void main(void) {
    gl_Position = vec4(in_Position, 1.0);
    pass_Color = color;
}

通话后,我得到正确的 uniformSize、长度和类型,但没有名称。

4

1 回答 1

2

就 OpenGL 的使用而言,您这样做是正确的。问题来自您正在使用的 SharpGL 绑定。由于最后一个参数被声明为类型string,并且字符串(大部分)在 .NET 中是不可变的,因此该函数无法将名称输出给您。除了自己修改绑定之外,您有两种选择:

  • 检查 SharpGL 是否提供了另一个重载,GetActiveUniform该重载将可变对象作为名称参数,例如 a StringBuilder, achar[]甚至可能是 an out string(通过引用)。
  • 使用另一个绑定库。OpenTK 是一个非常好的、干净且维护良好的。它使用ref参数而不是让您创建大量的单元素数组。我强烈推荐它。
于 2014-05-29T12:54:12.070 回答