C# GetUniformLocation()返回-1

C# GetUniformLocation()返回-1,c#,opengl,opentk,C#,Opengl,Opentk,代码 GL.GetUniformLocation(); 对于glsl代码中的统一转换,返回-1 #version 420 layout(location = 0) in vec3 position; uniform mat4 transform; void main() { gl_Position = transform * vec4(position, 1.0); } 关于这一点,我能找到的唯一其他帖子谈到了优化器编译它,但我不知道它如何做到这一点,因为它在着色器的最终输出中是

代码

GL.GetUniformLocation();
对于glsl代码中的统一转换,返回-1

#version 420

layout(location = 0) in vec3 position;

uniform mat4 transform;
void main()
{
    gl_Position = transform * vec4(position, 1.0);
}
关于这一点,我能找到的唯一其他帖子谈到了优化器编译它,但我不知道它如何做到这一点,因为它在着色器的最终输出中是必不可少的。我正在使用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);
    }
制服是一本字典

着色器代码:

#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();
        });

显然,在编译着色器并将程序链接到此处之前,您会尝试查询位置:


链接过程中会指定统一的位置。

请参阅,可能的解决方案是,您可能没有针对ES3。整个着色器程序是否实际编译和链接?是的,当我将矩阵设置为默认值mat41.0时,我渲染的三角形会出现,如果没有此选项,则不会出现,我也会对这两个错误进行检查,并在失败时重试。显示实际代码。
       shader.AddUniform("transform");

       shader.ComplieShader();