如何使用GetActiveUniform?

时间:2014-05-29 10:46:05

标签: c# opengl sharpgl

一般来说,问题在标题中。

我无法理解如何使用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,长度和类型,但没有名字。

1 个答案:

答案 0 :(得分:2)

就OpenGL的使用而言,您正确地执行此操作。问题来自您正在使用的SharpGL绑定。由于最后一个参数被声明为类型string并且字符串(大多数)在.NET中是不可变的,因此该函数无法输出您的名称。如果没有自己修改绑定,您有两个选择:

  • 检查SharpGL是否提供另一个GetActiveUniform重载,它将一个可变对象作为名称参数,例如StringBuilderchar[]或甚至out string(通过参考)。
  • 使用其他绑定库。 OpenTK是一个非常好,干净,维护良好的。它使用ref参数,而不是创建大量的单元素数组。我强烈推荐它。