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

标签 c opengl glsl shader

我正在学习 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 字节,而最后一个字节被垃圾填满。

关于c - GLSL 着色器编译失败(但只是有时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66150212/

相关文章:

c - raw bin 到 coff 的转换

c - 将命令行参数保存为 C 中的全局变量

c++ - 为 std::vector<user-defined> 赋值

c++ - assimp模型加载不加载所有网格

c++ - 如何在 OpenGL 中制作好看的 cel 着色线?

c++ - 游戏GUI库

c++ - OpenGL 忽略四边形并将它们变成三角形

c - 如何在 C 结构中定义变量的值?

android - 有没有办法在顶点着色器的一个点的位置用 fragment 着色器绘制一个圆?

opengl-es - 基于纹理像素为平面着色