diff options
| author | DrNuget <drnuget@outlook.com> | 2026-01-07 04:58:54 +0200 |
|---|---|---|
| committer | DrNuget <drnuget@outlook.com> | 2026-01-07 04:58:54 +0200 |
| commit | 7f3aa1cff755d21d972457b05c140cf465b9fa19 (patch) | |
| tree | 748b74a65d71ead9d0d7ade533074c5a643076d7 /src/engine/M_shader.c | |
| parent | 67592a66dd9bcc4d79d23624a9abfd8f2c6e92ff (diff) | |
| download | mnm-7f3aa1cff755d21d972457b05c140cf465b9fa19.tar.gz | |
some basic 3D rendering and the base for chunk generation etc.
Diffstat (limited to 'src/engine/M_shader.c')
| -rw-r--r-- | src/engine/M_shader.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/engine/M_shader.c b/src/engine/M_shader.c new file mode 100644 index 0000000..17f6248 --- /dev/null +++ b/src/engine/M_shader.c @@ -0,0 +1,57 @@ +#include "M_shader.h" + +unsigned int M_loadShader(const char* filename, unsigned int shadertype) +{ + void* shader_source = SDL_LoadFile(filename, NULL); + unsigned int shader = glCreateShader(shadertype); + glShaderSource(shader, 1, (const char**)&shader_source, NULL); + glCompileShader(shader); + SDL_free(shader_source); + + int success; + + glGetShaderiv(shader, GL_COMPILE_STATUS, &success); + if (!success) { + printf("Couldn't compile shader\n"); + return 0; + } + + return shader; +} + +M_ShaderProgram M_createShaderProgram(const char *vertex_shader_file, const char* fragment_shader_file) +{ + unsigned int vertex_shader = M_loadShader(vertex_shader_file, GL_VERTEX_SHADER); + unsigned int fragment_shader = M_loadShader(fragment_shader_file, GL_FRAGMENT_SHADER); + return M_compileShaderProgram(vertex_shader, fragment_shader); +} + +M_ShaderProgram M_compileShaderProgram(unsigned int vertex_shader, unsigned int fragment_shader) +{ + M_ShaderProgram shader_program; + shader_program.prog = glCreateProgram(); + glAttachShader(shader_program.prog, vertex_shader); + glAttachShader(shader_program.prog, fragment_shader); + glLinkProgram(shader_program.prog); + + shader_program.vertex_shader = vertex_shader; + shader_program.fragment_shader = fragment_shader; + + int success; + glGetProgramiv(shader_program.prog, GL_LINK_STATUS, &success); + if (!success) { + printf("Couldn't link shader program\n"); + } + + shader_program.transform_loc = glGetUniformLocation(shader_program.prog, "model"); + shader_program.view_loc = glGetUniformLocation(shader_program.prog, "view"); + shader_program.projection_loc = glGetUniformLocation(shader_program.prog, "projection"); + + return shader_program; +} + +void M_killShaderProgram(M_ShaderProgram *shader_program) +{ + glDeleteShader(shader_program->vertex_shader); + glDeleteShader(shader_program->fragment_shader); +} |
