C GLSL着色器编译失败(但仅有时会失败)

C GLSL着色器编译失败(但仅有时会失败),c,opengl,glsl,shader,C,Opengl,Glsl,Shader,我正在学习OpenGL,现在我被困在加载着色器上。90%的情况下,此代码有效。在另外10%的时间里,顶点着色器的编译会出现以下错误(为了更易于阅读,我从下面的代码中删除了错误日志): 顶点着色器: #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 =

我正在学习OpenGL,现在我被困在加载着色器上。90%的情况下,此代码有效。在另外10%的时间里,顶点着色器的编译会出现以下错误(为了更易于阅读,我从下面的代码中删除了错误日志):

顶点着色器:

#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代码使用GCC编译C99。谢谢你的阅读

我怀疑问题在于
source\u vert
source\u frag
缓冲区不是空终止的。您为每个文件分配
file\u size+1
字节,但通过读取文件只填充
file\u size
字节,最后一个字节充满垃圾。

用户7860670的回答解决了我的问题:只需要一个
source\u vert[file\u size]='\0',问题就解决了。我还添加了
source\u frag[file\u size]='\0'只是为了安全。确保为空终止字符串!!:)

啊,我觉得很傻。当我分配
file\u size
字节时,我会在片段着色器的末尾得到垃圾,这就是为什么我会将
file\u size+1
。我只是忘了在着色器源字符串的末尾包含“\0”。多谢各位!
#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);
}