[英]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_vert
和source_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.