顶点着色器编译失败:0:1(10): 错误:不支持 GLSL 4.30

问题描述

我的 linux 系统在编译顶点着色器时遇到问题。

首先,这是我遇到的错误

Vertex Shader compilation failed: 0:1(10): error: GLSL 4.30 is not supported. Supported versions are: 1.10,1.20,1.30,1.00 ES,3.00 ES,3.10 ES,and 3.20 ES

Vertex Shader compilation failed: 0:1(10): error: GLSL 4.30 is not supported. Supported versions are: 1.10,and 3.20 ES

Shader linking failed: error: linking with uncompiled/unspecialized shadererror: linking with uncompiled/unspecialized shader

这是顶点着色器

#version 430 core

layout (location = 0) in vec4 vPosition;
void main(){


     gl_Position = vPosition;
     gl_PointSize = 50.0;

}

这是片段着色器

#version 430 core

out vec4 fColor;

void main(){


     fColor = vec4(1.0,0.0,1.0);
}

这是C代码

#include <GL/glew.h>
#include <GL/freeglut.h>
#include <stdio.h>
#include <stdlib.h>

GLuint  vao;
GLuint  vbo;
GLuint v,f;

GLfloat vertices[3][2] = { { -0.90,-0.90 },// Triangle 1
                           { 0.90,{ -0.90,0.90 },};


char* ReadFile(const char* filename);
GLuint initShaders(char* v_shader,char* f_shader);
void init();
void display(void);

/************************************************/

char* ReadFile(const char* filename) {

    FILE* infile;
#ifdef WIN32
    fopen_s(&infile,filename,"rb");
#else
    infile = fopen(filename,"rb");
#endif


    if (!infile) {
        printf("Unable to open file %s\n",filename);
        return NULL;
    }

    fseek(infile,SEEK_END);
    int len = ftell(infile);
    fseek(infile,SEEK_SET);
    char* source = (char*)malloc(len + 1);
    fread(source,1,len,infile);
    fclose(infile);
    source[len] = 0;
    return (source);

}

/*************************************************************/

GLuint initShaders(const char* v_shader,const char* f_shader) {

    GLuint p = glCreateProgram();

    v = glCreateShader(GL_VERTEX_SHADER);
    f = glCreateShader(GL_FRAGMENT_SHADER);

    const char * vs = ReadFile(v_shader);
    const char * fs = ReadFile(f_shader);

    glShaderSource(v,&vs,NULL);
    glShaderSource(f,&fs,NULL);

    free((char*)vs);
    free((char*)fs);

    glCompileShader(v);

    GLint compiled;

    glGetShaderiv(v,GL_COMPILE_STATUS,&compiled);
    if (!compiled) {
        GLsizei len;
        glGetShaderiv(v,GL_INFO_LOG_LENGTH,&len);

        char* log = (char*)malloc(len + 1);

        glGetShaderInfoLog(v,&len,log);

        printf("Vertex Shader compilation failed: %s\n",log);

        free(log);

    }

    glCompileShader(f);
    glGetShaderiv(f,&compiled);

    if (!compiled) {

        GLsizei len;
        glGetShaderiv(f,&len);
        char* log = (char*)malloc(len + 1);
        glGetShaderInfoLog(f,log);
        printf("Vertex Shader compilation failed: %s\n",log);
        free(log);
    }

    glAttachShader(p,v);
    glAttachShader(p,f);
    glLinkProgram(p);
    GLint linked;

    glGetProgramiv(p,GL_LINK_STATUS,&linked);

    if (!linked) {

        GLsizei len;
        glGetProgramiv(p,&len);
        char* log = (char*)malloc(len + 1);
        glGetProgramInfoLog(p,log);
        printf("Shader linking failed: %s\n",log);
        free(log);
    }

    glUseProgram(p);

    return p;

}

/*******************************************************/

void init() {

    glGenVertexArrays(1,&vao);
    glBindVertexArray(vao);
    glGenBuffers(1,&vbo);
    glBindBuffer(GL_ARRAY_BUFFER,vbo);
    glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);
    GLuint program = initShaders("triangle.vs","triangle.fs");

    glVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,0);
    glEnableVertexAttribArray(0);

}

/**********************************************************/

void display(void) {

    glClear(GL_COLOR_BUFFER_BIT);

    glBindVertexArray(vao);
    glDrawArrays(GL_TRIANGLES,3);
    glFlush();

}

/*******************************************************/

int main(int argc,char** argv) {

    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_RGBA);
    glutInitWindowSize(512,512);
    glutInitWindowPosition(0,0);
    glutCreateWindow("Triangle");

    if (glewInit()) {
        printf("%s\n","Unable to initialize GLEW ...");
    }

    init();
    /* we can now get data for the specific OpenGL instance we created */
    const GLubyte *renderer = glGetString(GL_RENDERER);
    const GLubyte *vendor = glGetString(GL_VENDOR);
    const GLubyte *version = glGetString(GL_VERSION);
    const GLubyte *glslVersion = glGetString(GL_SHADING_LANGUAGE_VERSION);
    
    printf("GL Vendor : %s\n",vendor);
    printf("GL Renderer : %s\n",renderer);
    printf("GL Version (string) : %s\n",version);
    
    printf("GLSL Version : %s\n",glslVersion);
    printf("%s\n",glGetString(GL_VERSION));
    glutDisplayFunc(display);
    glutMainLoop();

    return 0;

}

/*******************************************************/

这是我的系统 opengl 信息来自 glxinfo | grep OpenGL

OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Intel(R) UHD Graphics 620 (Kabylake GT2)
OpenGL core profile version string: 4.5 (Core Profile) Mesa 18.3.6
OpenGL core profile shading language version string: 4.50
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 3.0 Mesa 18.3.6
OpenGL shading language version string: 1.30
OpenGL context flags: (none)
OpenGL extensions:
OpenGL ES profile version string: OpenGL ES 3.2 Mesa 18.3.6
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20
OpenGL ES profile extensions:

我为 linux 安装了所有我看到需要的 mesa/glut/glew 包,但似乎安装了所有需要的东西。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)