OpenTK始终为-1的统一位置

时间:2017-04-10 15:54:22

标签: c# opengl glsl opentk

我一直在尝试学习OpenTk,以便我可以在c#中轻松使用OpenGl。我现在的问题是,当我试图获得两件制服的位置时,它会返回-1。

顶点着色器:

#version 440 core

uniform vec3 position

void main(void)
{
    gl_Position = position;
}

Fragment Shader:

#version 440 core

uniform vec4 frag_Color;
out vec4 color;

void main(void)
{
    color = frag_Color;
}

代码:

GL.BindVertexArray(pointVertexArray);
GL.UseProgram(program);

int a = GL.GetUniformLocation(program, "position");
int b = GL.GetUniformLocation(program, "frag_Color");

Debug.WriteLine(a + ", " + b);

GL.DrawArrays(PrimitiveType.Points, 0, 1);
GL.PointSize(size);

编辑: 这是我创建程序的地方:

public int CreateShader(string path) {
        var vertexShader = GL.CreateShader(ShaderType.VertexShader);

        GL.ShaderSource(vertexShader, File.ReadAllText(".\\shaders\\" + path + ".vert"));
        GL.CompileShader(vertexShader);

        var fragmentShader = GL.CreateShader(ShaderType.FragmentShader);
        GL.ShaderSource(fragmentShader, File.ReadAllText(".\\shaders\\" + path + ".frag"));
        GL.CompileShader(fragmentShader);

        var program = GL.CreateProgram();
        GL.AttachShader(program, vertexShader);
        GL.AttachShader(program, fragmentShader);
        GL.LinkProgram(program);

        GL.DetachShader(program, vertexShader);
        GL.DetachShader(program, fragmentShader);
        GL.DeleteShader(vertexShader);
        GL.DeleteShader(fragmentShader);

        programs.Add(program);
        return program;
    }

1 个答案:

答案 0 :(得分:2)

请记住检查着色器的编译状态。

int status;
GL.GetShader(shader, ShaderParameter.CompileStatus, out status);
if (status == 0)
    throw new Exception(
        String.Format("Error compiling {0} shader: {1}",
            type.ToString(), GL.GetShaderInfoLog(shader)));

因为您的顶点着色器只有两个拼写错误,编译状态会告诉您。

  

0(5):错误C0000:语法错误,意外保留字“void”,期待','或';'在令牌“void”

     

0(7):错误C1035:分配不兼容的类型

您缺少分号,而gl_Positionvec4而不是vec3,编译状态会告诉您。

uniform vec3 position;
                     ^ Missing
[...]

gl_Position = vec4(position, 1.0);