我正在学习 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
字节,而最后一个字节被垃圾填满。
关于c - GLSL 着色器编译失败(但只是有时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66150212/