summaryrefslogtreecommitdiff
path: root/src/engine/M_shader.c
diff options
context:
space:
mode:
authorDrNuget <drnuget@outlook.com>2026-01-07 04:58:54 +0200
committerDrNuget <drnuget@outlook.com>2026-01-07 04:58:54 +0200
commit7f3aa1cff755d21d972457b05c140cf465b9fa19 (patch)
tree748b74a65d71ead9d0d7ade533074c5a643076d7 /src/engine/M_shader.c
parent67592a66dd9bcc4d79d23624a9abfd8f2c6e92ff (diff)
downloadmnm-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.c57
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);
+}