c# - glsl VertexShader/FragmentShader 拒绝在 OpenTk c# 中编译

标签 c# opengl glsl shader opentk

我已经按照本教程尝试学习 OpenTK ( https://www.youtube.com/watch?v=elEyLoQQ67o&t=1182s ) 我的代码与他的代码几乎相同,但是当程序运行时,片段着色器和像素着色器都无法编译,并出现模糊错误“错误: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);

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

最佳答案

1f 不是有效的 GLSL 语法(这不是 C 或 C++)。 1.0f1.0 或简单的 1。在GLSL中,1.0是单精度浮点文字,对于 double ,您必须使用后缀lf(例如1.0lf)。参见alos The OpenGL® Shading Language, Version 4.60.7 - 4.1.4. Floats .

gl_Position = vec4(aPosition, 1f);

gl_Position = vec4(aPosition, 1);

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

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

关于c# - glsl VertexShader/FragmentShader 拒绝在 OpenTk c# 中编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73085213/

相关文章:

c# - WP7 子弹出窗口中的后退按键处理

opengl - 着色器 - 镜面闪光 - 闪闪发光的效果

c++ - 尝试在 Win32 OpenGL 中使用着色器,但顶点着色器不绘制任何内容

opengl - 启用深度测试后,线条出现分段

c++ - 上下文初始化后 GL_INVALID_ENUM

c++ - 基于四元数的相机不需要的滚动

c++ - GLSL - 程序链接错误 : Slot 0 unavailable from layout location request

c# - 从已建立的 SqlConnection 确定 TLS 版本

C# 如何将一个对象序列化/反序列化到/从 Dictionary<string,Object> 以将其保存/加载到 Couchbase.lite

c# - 等待在 selenium 和 c# 中完成下载文件