编译GLSL程序时出现“语法错误,意外$END”?

6ljaweal  于 2022-10-18  发布在  其他
关注(0)|答案(1)|浏览(118)

我在编译着色器时遇到了问题。我非常确定问题出在我的文件加载代码上。
以下是相关的功能:

char* loadShader(char* filename){
    char* buffer = 0;
    long length;
    FILE* f = fopen (filename, "rb");
    if(!f){
        // error reading file
        printf("failed to open file\n");
    }

    if (f){
        fseek (f, 0, SEEK_END);
        length = ftell (f);
        fseek (f, 0, SEEK_SET);
        buffer = malloc (length+1);
        if (buffer){
            fread (buffer, 1, length, f);
        }
        fclose (f);
    }
    return buffer;
}

Renderer* initRenderer(){
    Renderer* renderer = malloc(sizeof(Renderer));
    //renderer->vertices[0] = -0.5f; 
    float verts[] = {
        -0.5f, -0.5f, 0.0f,
        0.5f, -0.5f, 0.0f,
        0.0f,  0.5f, 0.0f
    };
    for(int i = 0; i < 9; i++){
        renderer->vertices[i] = verts[i];
    }
    glGenBuffers(1, &renderer->VBO);
    glBindBuffer(GL_ARRAY_BUFFER, renderer->VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(renderer->vertices), renderer->vertices, GL_STATIC_DRAW);
    GLchar* vst = (GLchar*)loadShader("game_data/assets/shaders/simple_vert.glsl");
    GLchar* fst = (GLchar*)loadShader("game_data/assets/shaders/simple_frag.glsl");
    const GLchar* vertexShaderSource = vst;
    const GLchar* fragmentShaderSource = fst;
    if(vst){free(vst);}
    if(fst){free(fst);}
    int  success;
    char infoLog[512];
    unsigned int vertexShader;
    vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
    glCompileShader(vertexShader);
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
    if(!success)
    {
        glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
        printf("ERROR::SHADER::VERTEX::COMPILATION_FAILED\n");
        printf("%s\n", infoLog);
        //std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
    }
    unsigned int fragmentShader;
    fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
    glCompileShader(fragmentShader);
    glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
    if(!success)
    {
        glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
        printf("ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n");
        printf("%s\n", infoLog);
        //std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
    }

    return renderer;
}

顶点明暗器:


# version 330 core

layout (location = 0) in vec3 aPos;

void main()
{
    gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}

片段着色器:


# version 330 core

out vec4 FragColor;

void main()
{
    FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
}

最后是错误消息:

ERROR::SHADER::VERTEX::COMPILATION_FAILED
0:1(1): error: syntax error, unexpected $end

ERROR::SHADER::FRAGMENT::COMPILATION_FAILED
0:1(1): error: syntax error, unexpected $end

我肯定我遗漏了一些简单的弦乐。我看了this的答案,也有类似的问题,但我无法从其中收集到任何东西。

uwopmtnx

uwopmtnx1#

不是打开文件的Maven,但你在RB(读取二进制)模式下打开它,也许可以尝试在R(读取)模式下打开它。

相关问题