繁体   English   中英

GLSL 着色器编译失败(但只是有时)

[英]GLSL Shader Compilation Fails (But Only Sometimes)

我正在学习 OpenGL,现在我被困在加载着色器上。 90% 的时间,这段代码都有效。 另外 10% 的时间,我在顶点着色器的编译中收到以下错误(为了便于阅读,我从下面的代码中删除了错误日志。):

Vertex shader failed to compile with the following errors:
ERROR: 0:16: error(#132) Syntax error: "<" parse error
ERROR: error(#273) 1 compilation errors.  No code generated

着色器加载代码:

unsigned int LoadShader(const char *path_vert, const char *path_frag) { // Returns shader program ID.
    unsigned int shader_program;
    FILE *file;
    char *source_vert, *source_frag;
    unsigned int file_size;
    
     // Read vertex shader.
    file = fopen(path_vert, "rb");
    
    fseek(file, 0, SEEK_END);
    file_size = ftell(file);
    fseek(file, 0, SEEK_SET);
    
    source_vert = (char*)malloc(file_size + 1);
    fread(source_vert, 1, file_size, file);
    
     // Read fragment shader.
    file = fopen(path_frag, "rb");
    
    fseek(file, 0, SEEK_END);
    file_size = ftell(file);
    fseek(file, 0, SEEK_SET);
    
    source_frag = (char*)malloc(file_size + 1);
    fread(source_frag, 1, file_size, file);
    
    fclose(file);

     // Make sure the shader sources aren't garbage.
    printf("%s\n\n %s\n", source_vert, source_frag);
    
    // Create vertex shader.
    unsigned int vert_shader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vert_shader, 1, &source_vert, NULL);
    glCompileShader(vert_shader);
    
    // Create fragment shader.
    unsigned int frag_shader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(frag_shader, 1, &source_frag, NULL);
    glCompileShader(frag_shader);
    
    // Create shader program.
    shader_program = glCreateProgram();
    glAttachShader(shader_program, vert_shader);
    glAttachShader(shader_program, frag_shader);
    glLinkProgram(shader_program);

     // Clean up the extra bits.
    glDeleteShader(vert_shader);
    glDeleteShader(frag_shader);
    free(source_vert);
    free(source_frag);
    
    return shader_program;
}

顶点着色器:

#version 460 core

layout (location = 0) in vec3 a_pos
layout (location = 1) in vec2 a_tex_coord

out vec2 tex_coord;

void main() {
    gl_Position = vec4(a_pos, 1.0f);
    tex_coord = a_tex_coord;
}

片段着色器:

#version 460 core

uniform sampler2D tex0;

in vec2 tex_coord;

out vec4 frag_color;

void main() {
    frag_color = texture(tex0, tex_coord);
}

我正在使用 VS Code 为 C99 编译 GCC。 谢谢阅读!

我怀疑问题在于source_vertsource_frag缓冲区不是以空值结尾的。 您为每个分配file_size + 1个字节,然后仅通过从文件中读取来填充file_size字节,最后一个字节被垃圾填充。

user7860670的回答解决了我的问题:所需要的只是一个source_vert[file_size] = '\0'; 问题就解决了。 我还添加了source_frag[file_size] = '\0'; 只是为了安全。 确保以空值终止您的字符串:! :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM