我正在创建一个 C 标头来从文件加载我的着色器,而不是我之前的做法,如下所示:
const char *vertexShaderSource = "#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"void main()\n"
"{\n"
" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
"}\0";
这样,我只需将着色器设置为
const
就可以了。但现在我想让它从一个单独的文件中读取,所以我创建了这个标题:
#define ASSERT(x, str) if (!(x)) {printf(str); exit(1);}
typedef unsigned int uint;
typedef int32_t i32;
uint shader_create_program(char vertex_path[], char fragment_path[]) {
// Vertex shader
FILE* file = fopen(vertex_path, "r");
i32 success;
fseek(file, 0, SEEK_END);
int size = ftell(file) + 1;
char vertex_shader_source[size];
fread(vertex_path, sizeof(char), size, file);
vertex_shader_source[size] = '\0';
fclose(file);
uint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL);
glCompileShader(vertex_shader);
glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success);
ASSERT(success, "Error compiling vertex shader");
// Fragment shader
file = fopen(vertex_path, "r");
fseek(file, 0, SEEK_END);
size = ftell(file) + 1;
char fragment_shader_source[size];
fread(fragment_shader_source, sizeof(char), size, file);
fragment_shader_source[size] = '\0';
fclose(file);
uint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL);
glCompileShader(fragment_shader);
glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success);
ASSERT(success, "Error compiling fragment shader");
// Create shader program
uint shader_program = glCreateProgram();
glAttachShader(shader_program, vertex_shader);
glAttachShader(shader_program, fragment_shader);
glLinkProgram(shader_program);
glDeleteShader(vertex_shader);
glDeleteShader(fragment_shader);
glGetProgramiv(shader_program, GL_LINK_STATUS, &success);
ASSERT(success, "Error linking shaders");
glUseProgram(shader_program);
return shader_program;
}
这给了我错误,因为
glShaderSource
第三个参数预计是const char
。
我尝试将其设置为常量,但显然,在这种情况下不能这样,因为我必须操纵它。
问题可以在这个片段中找到:
char vertex_shader_source[size]; // Initialize the source here
fread(vertex_path, sizeof(char), size, file); // I have to read the file into the buffer
vertex_shader_source[size] = '\0'; // And also add the end char
fclose(file);
uint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL);
// Then, here it was expecting for a constant value
如果需要我的着色器代码:(vertex-shader.glsl)
# version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aCol;
out vec4 _color;
uniform vec4 uniform_color;
void main()
gl_Position = vec4(aPos, 1);
_color = vec4(aCol, 1);
}
错误信息:
expected ‘const GLchar * const*’ {aka ‘const char * const*’} but argument is of type ‘char (*)[size]’
我无法谈论语义,因为我不使用 OpenGL,但要获得所需的类型,您可以使用
& (const char *) { vertex_shader_source }
作为参数。这将创建一个指向 vertex_shader_source
的第一个元素的复合文字,然后获取其地址。