From 7142ed2d6adc29b2f259c5a13f7a934bb57f6f81 Mon Sep 17 00:00:00 2001 From: JonasJan2 Date: Sat, 22 Jun 2024 11:24:14 +0200 Subject: [PATCH] Added new shader struct --- src/Makefile | 4 ++-- src/main.c | 48 ++++++++++++++++++------------------------------ src/shader.c | 29 +++++++++++++++++++++++++++++ src/shader.h | 13 +++++++++++++ 4 files changed, 62 insertions(+), 32 deletions(-) create mode 100644 src/shader.c create mode 100644 src/shader.h diff --git a/src/Makefile b/src/Makefile index 17e08fb..bebb830 100644 --- a/src/Makefile +++ b/src/Makefile @@ -4,7 +4,7 @@ OTHER_LIBS = -lm ALL_LIBS = $(GLEW_LIBS) $(GLFW_LIBS) $(OTHER_LIBS) -OBJ = matrixMath.o transformation.o wavefrontobj.o sceneGraph.o objectHandler.o +OBJ = matrixMath.o transformation.o wavefrontobj.o sceneGraph.o objectHandler.o shader.o SHADERS = fragmentShader.c vertexShader.c cg1.out: test.out main.o $(OBJ) $(SHADERS) @@ -17,7 +17,7 @@ test.out: test.o $(OBJ) %Shader.c: %Shader.glsl xxd -i $? > $@ -main.o: $(SHADERS) matrixMath.h transformation.h wavefrontobj.h sceneGraph.h objectHandler.h +main.o: $(SHADERS) matrixMath.h transformation.h wavefrontobj.h sceneGraph.h objectHandler.h shader.h test.o: matrixMath.h transformation.h wavefrontobj.h diff --git a/src/main.c b/src/main.c index db0c86d..ac82afc 100644 --- a/src/main.c +++ b/src/main.c @@ -11,11 +11,13 @@ #include "transformation.h" #include "wavefrontobj.h" #include "sceneGraph.h" +#include "shader.h" #include #include #include #include +#include GLuint program; @@ -55,6 +57,8 @@ SceneNode* rootNode; * Input handler for camera movement. * */ void handleInputs(double deltaTime) { + assert(window != NULL); + if (glfwGetKey(window, GLFW_KEY_1) == GLFW_PRESS) { cameraPosition = (vec3){0.0f, 1.7f, 2.4f}; } @@ -108,6 +112,7 @@ void handleInputs(double deltaTime) { // input handler to quit with ESC void keyboardHandler(GLFWwindow* window, int key, int scancode, int action, int mods) { + assert(window != NULL); if (action == GLFW_PRESS) { if (key == GLFW_KEY_ESCAPE) { exitRequested = true; @@ -116,6 +121,8 @@ void keyboardHandler(GLFWwindow* window, int key, int scancode, int action, int } void renderNode(SceneNode* node) { + assert(node != NULL); + if (!node->model) return; mat4 modelView; @@ -152,45 +159,26 @@ void renderNode(SceneNode* node) { draw_object(node->model->objectData); } -void compileShader(const GLchar *shaderSource, GLuint* shader, GLenum shaderType) { - // Create the shader object - *shader = glCreateShader(shaderType); - - // Attach the shader source code to the shader object - glShaderSource(*shader, 1, &shaderSource, NULL); - - // Compile the shader - glCompileShader(*shader); - - // Check the compile status - GLint status; - glGetShaderiv(*shader, GL_COMPILE_STATUS, &status); - - // If compilation failed, retrieve and print the error log - if (!status) { - printf("Error compiling shader: "); - GLchar infoLog[1024]; - glGetShaderInfoLog(*shader, 1024, NULL, infoLog); - printf("%s\n", infoLog); - exit(1); - } -} - void init(void) { //IDEE: shader in array speichern und dann so kompilieren etc GLuint vertexShader; GLuint fragmentShader; GLint status; - compileShader(vertexShader_glsl, &vertexShader, GL_VERTEX_SHADER); - compileShader(fragmentShader_glsl, &fragmentShader, GL_FRAGMENT_SHADER); + Shader shaders[2] = { + {GL_VERTEX_SHADER, 0}, + {GL_FRAGMENT_SHADER, 0} + }; + + compileShader(vertexShader_glsl, &shaders[0]); + compileShader(fragmentShader_glsl, &shaders[1]); - // create and link shader program program = glCreateProgram(); - //das müsste evtl noch angepasst werden - glAttachShader(program, vertexShader); - glAttachShader(program, fragmentShader); + // das müsste evtl noch angepasst werden + for (int i = 0; i < 2; i++) { + glAttachShader(program, shaders[i].id); + } glLinkProgram(program); diff --git a/src/shader.c b/src/shader.c new file mode 100644 index 0000000..a84e0f8 --- /dev/null +++ b/src/shader.c @@ -0,0 +1,29 @@ +#include +#include + +#include +#include + +typedef struct { + GLenum type; + GLuint id; +} Shader; + +void compileShader(const GLchar *shaderSource, Shader *shader) { + shader->id = glCreateShader(shader->type); + + glShaderSource(shader->id, 1, &shaderSource, NULL); + + glCompileShader(shader->id); + + GLint status; + glGetShaderiv(shader->id, GL_COMPILE_STATUS, &status); + + if (!status) { + printf("Error compiling shader: "); + GLchar infoLog[1024]; + glGetShaderInfoLog(shader->id, 1024, NULL, infoLog); + printf("%s\n", infoLog); + exit(1); + } +} \ No newline at end of file diff --git a/src/shader.h b/src/shader.h new file mode 100644 index 0000000..01646ea --- /dev/null +++ b/src/shader.h @@ -0,0 +1,13 @@ +#ifndef SHADER_UTIL_H +#define SHADER_UTIL_H + +#include + +typedef struct { + GLenum type; + GLuint id; +} Shader; + +void compileShader(const GLchar *shaderSource, Shader *shader); + +#endif \ No newline at end of file