opengl glsl顶点着色器/片段着色器拒绝在OpenTk c#中编译

kqhtkvqz  于 2022-11-04  发布在  C#
关注(0)|答案(1)|浏览(178)

我已经按照这个教程来尝试学习OpenTK(https://www.youtube.com/watch?v=elEyLoQQ67o&t=1182s)我的代码与他的代码几乎完全相同,但是当程序运行时,碎片着色器和像素着色器都无法编译,并出现模糊错误“ERROR:0:8:'f':语法错误语法错误”。并且当程序被链接时,它会随机给出错误“附加的片段着色器未编译。”或“附加的顶点着色器未编译。”每次程序运行时。我完全被难住了,不知道是什么导致了错误,因为我找不到代码的错误,着色器尽可能简单。
这段代码的作用是在屏幕上绘制一个三角形。

string vertexShaderCode = 
        @"
        #version 460 core

        layout (location = 0) in vec3 aPosition;

        void main()
        {
            gl_Position = vec4(aPosition, 1f);
        }

        ";

        string fragmentShaderCode =
        @"
        #version 460 core

        out vec4 fragColor;

        void main()
        {
            fragColor = vec4(0f, 0f, 0.5f, 1f);
        }
        ";

        int vertexShader = GL.CreateShader(ShaderType.VertexShader);
        GL.ShaderSource(vertexShader, vertexShaderCode);
        GL.CompileShader(vertexShader);

        GL.GetShader(vertexShader, ShaderParameter.CompileStatus, out int d);
        if (d == 0)
        {
            string infoLog = GL.GetShaderInfoLog(vertexShader);
            System.Console.WriteLine(infoLog);
        }

        int fragmentShader = GL.CreateShader(ShaderType.FragmentShader);
        GL.ShaderSource(fragmentShader, fragmentShaderCode);
        GL.CompileShader(fragmentShader);

        GL.GetShader(fragmentShader, ShaderParameter.CompileStatus, out int a);
        if (a == 0)
        {
            string infoLog = GL.GetShaderInfoLog(fragmentShader);
            System.Console.WriteLine(infoLog);
        }

        this.shaderProgram = GL.CreateProgram();
        GL.AttachShader(this.shaderProgram, vertexShader);
        GL.AttachShader(this.shaderProgram, fragmentShader);

        GL.LinkProgram(this.shaderProgram);

        int linkStatus = 0;
        GL.GetProgram(this.shaderProgram, GetProgramParameterName.LinkStatus, out linkStatus);
        string infolog = GL.GetProgramInfoLog(this.shaderProgram);
        Console.WriteLine(infolog);

        GL.DetachShader(this.shaderProgram, vertexShader);
        GL.DetachShader(this.shaderProgram, fragmentShader);

        GL.DeleteShader(vertexShader);
        GL.DeleteShader(fragmentShader);

另一件事,虽然着色器无法编译,但仍然会在屏幕上绘制一个三角形,这应该是不可能的,对吗?我能想到的唯一解释是,硬件有某种基础顶点着色器,如果没有提供自定义顶点着色器,它会求助于这种着色器。

dwbf0jvd

dwbf0jvd1#

1f不是有效的GLSL语法(这不是C或C++)。可以是1.0f1.01。在GLSL中,1.0是单精度浮点文字,如果是双精度,则必须使用后缀lf(例如1.0lf)。请参阅OpenGL®着色语言,版本4.60.7 - 4.1.4。浮点数。
gl_Position = vec4(aPosition, 1f);

gl_Position = vec4(aPosition, 1);

fragColor = vec4(0f, 0f, 0.5f, 1f);

fragColor = vec4(0, 0, 0.5, 1);

相关问题