GetUniformLocation() returns -1

GetUniformLocation() returns -1

密码

GL.GetUniformLocation();

returns -1 为 glsl 代码中的制服 "transform"

#version 420

layout(location = 0) in vec3 position;

uniform mat4 transform;
void main()
{
    gl_Position = transform * vec4(position, 1.0);
}

我能找到的唯一其他 post 谈到了优化器将其编译出来,但我不知道它是如何做到的,因为它在着色器的最终输出中是必不可少的。我正在使用 Windows 和普通编译器。当我 运行 GL.GetError() 我得到一个 InvalidOperation 错误。

完整代码为

C#代码:

    public void AddUniform(string Uniform)
    {
        int tries = 6;
        Start:
        int UniLocation = GL.GetUniformLocation(Program, Uniform);

#if DEBUG
        tries--;
        if(UniLocation == -1)
        {
            Console.WriteLine(this.ToString() + " Failed DEBUG AddUniform check");
            if (tries > 0)
            {
                goto Start;
            }
        }
#endif
        Uniforms.Add(Uniform, UniLocation);
    }

制服是Dictionary<string, int>

着色器代码:

#version 420

layout(location = 0) in vec3 position;

uniform mat4 transform = mat4(1.0);
void main()
{

    gl_Position = transform * vec4(position, 1.0);
}

实施:

        NewWindow.Init(() =>
        {
            mesh = new MobiusEngine.NewSystems.Mesh();
            shader = new MobiusEngine.NewSystems.Shader();

            mesh.AddVerticies(new MobiusEngine.NewSystems.Vertex(new OpenTK.Vector3d(-1, -1, 0)), new MobiusEngine.NewSystems.Vertex(new OpenTK.Vector3d(0, 1, 0)), new MobiusEngine.NewSystems.Vertex(new OpenTK.Vector3d(1, -1, 0)));

            shader.AddVertexShader(MobiusEngine.NewSystems.ShaderFunctions.LoadShader("BasicVertex.vert"));
            shader.AddFragmentShader(MobiusEngine.NewSystems.ShaderFunctions.LoadShader("BasicFrag.frag"));
            shader.AddUniform("transform");

            shader.ComplieShader();

        });
        double temp = 0d;
        NewWindow.Render(() =>
        {
            shader.Bind();
            shader.SetUniformM("transform", Matrix4.CreateTranslation((float)(Math.Abs(Math.Sin(temp))), 0, 0));
            temp += Time.DeltaTime.TotalSeconds;

            mesh.Draw();
        });

你显然在编译着色器之前尝试查询位置,程序链接在这里:

       shader.AddUniform("transform");

       shader.ComplieShader();

统一位置在链接期间分配。