diff options
author | pryazha <pryadeiniv@mail.ru> | 2025-02-20 15:10:11 +0500 |
---|---|---|
committer | pryazha <pryadeiniv@mail.ru> | 2025-02-20 15:10:11 +0500 |
commit | 34821e9fefb0d7cbf9e72a2457b2901edbbe03bb (patch) | |
tree | 59ec69f7d19aa48091b3d39ad0dfd6b26bacb88b /prge_shader.c |
initial
Diffstat (limited to 'prge_shader.c')
-rw-r--r-- | prge_shader.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/prge_shader.c b/prge_shader.c new file mode 100644 index 0000000..21a91f3 --- /dev/null +++ b/prge_shader.c @@ -0,0 +1,65 @@ +U32 compile_shader(GLenum type, Str8 filename) +{ + Arena *tmp = arena_alloc(0); + + Str8 src = str8_read_entire_file(tmp, filename); + if (!src.ptr || !src.length) { + str8print(str8_pushf(tmp, "[ERROR] : Failed to read \"%.*s\"\n", str8expand(filename))); + arena_release(tmp); + return 0; + } + + const char *csrc = str8_to_cstr(tmp, src); + + U32 id = glCreateShader(type); + glShaderSource(id, 1, &csrc, 0); + glCompileShader(id); + + S32 status; + glGetShaderiv(id, GL_COMPILE_STATUS, &status); + if (status == GL_FALSE) { + char log[512]; + glGetShaderInfoLog(id, 512, 0, log); + str8print(str8_pushf(tmp, "[ERROR] : Failed to compile : \"%.*s\"\n%s", str8expand(filename), log)); + } else { + str8print(str8_pushf(tmp, "[INFO] : \"%.*s\" compiled successfully.\n", str8expand(filename))); + } + + arena_release(tmp); + + return id; +} + +U32 create_shader_program(Str8 vert_filename, Str8 frag_filename) +{ + U32 vert = compile_shader(GL_VERTEX_SHADER, vert_filename); + U32 frag = compile_shader(GL_FRAGMENT_SHADER, frag_filename); + + Arena *tmp = arena_alloc(0); + + U32 id = glCreateProgram(); + glAttachShader(id, vert); + glAttachShader(id, frag); + glLinkProgram(id); + S32 success; + glGetProgramiv(id, GL_LINK_STATUS, &success); + if (success == GL_FALSE) { + char log[512]; + glGetProgramInfoLog(id, 512, 0, log); + str8print(str8_pushf(tmp, "[ERROR]: Failed to link shader program:\n%s", log)); + } else { + str8print(str8_pushf(tmp, "[INFO]: Shader program linked successfuly.\n\n")); + } + glDeleteShader(vert); + glDeleteShader(frag); + + arena_release(tmp); + + return id; +} + +void shader_set_mat4fv(U32 id, char *name, Mat4 m) +{ + S32 loc = glGetUniformLocation(id, name); + glUniformMatrix4fv(loc, 1, 0, (F32 *)&m); +} |