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