From eee534d8169acbb7dd0530c86281805f134a08ab Mon Sep 17 00:00:00 2001 From: MrGeorgen Date: Wed, 24 Jun 2020 21:47:26 +0200 Subject: [PATCH] triangle --- CMakeLists.txt | 2 +- {src => include}/main.h | 3 +- shader/test.frag | 7 ++++ shader/test.vert | 7 ++++ src/main.c | 81 ++++++++++++++++++++++++++++------------- 5 files changed, 73 insertions(+), 27 deletions(-) rename {src => include}/main.h (57%) create mode 100644 shader/test.frag create mode 100644 shader/test.vert diff --git a/CMakeLists.txt b/CMakeLists.txt index f23a080..32e2c32 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ project(minecraft-clone C) cmake_minimum_required(VERSION 3.9) set( CMAKE_EXPORT_COMPILE_COMMANDS ON ) -include_directories(lib/glad/include lib/advanced_C_standard_liberary/include) +include_directories(lib/glad/include lib/advanced_C_standard_liberary/include include) file(GLOB SOURCES "src/*.c" "lib/*/src/*.c") find_program(CCACHE_PROGRAM ccache) add_executable(test.out ${SOURCES}) diff --git a/src/main.h b/include/main.h similarity index 57% rename from src/main.h rename to include/main.h index ca68b48..00f3cf2 100644 --- a/src/main.h +++ b/include/main.h @@ -4,5 +4,6 @@ #include void glfwError(int id, const char *description); void framebuffer_size_callback(GLFWwindow *window, int width, int height); -unsigned int parseShader(const char *filePath); +unsigned int parseShader(const char *filePath, const GLenum shaderType); +unsigned int linkShader(unsigned int vertexShader, unsigned int fragmentShader); #endif diff --git a/shader/test.frag b/shader/test.frag new file mode 100644 index 0000000..a145b82 --- /dev/null +++ b/shader/test.frag @@ -0,0 +1,7 @@ +#version 330 core +out vec4 FragColor; + +void main() +{ + FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f); +} diff --git a/shader/test.vert b/shader/test.vert new file mode 100644 index 0000000..c74ea10 --- /dev/null +++ b/shader/test.vert @@ -0,0 +1,7 @@ +#version 330 core +layout (location = 0) in vec3 aPos; + +void main() +{ + gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0); +} diff --git a/src/main.c b/src/main.c index 3a1ca66..ebd0aff 100644 --- a/src/main.c +++ b/src/main.c @@ -4,6 +4,7 @@ #include #include #include "main.h" +#include int main() { if(!glfwInit()) { @@ -36,13 +37,27 @@ int main() { 0.5f, -0.5f, 0.0f, 0.0f, 0.5f, 0.0f }; + // parse shader + unsigned int vertexShader = parseShader("shader/test.vert", GL_VERTEX_SHADER); + unsigned int fragmentShader = parseShader("shader/test.frag", GL_FRAGMENT_SHADER); + unsigned int shaderProgram = linkShader(vertexShader, fragmentShader); + glUseProgram(shaderProgram); unsigned int VBO; - glGenBuffers(1, &VBO); + glGenBuffers(1, &VBO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + unsigned int VAO; + glGenVertexArrays(1, &VAO); + glBindVertexArray(VAO); + glBindBuffer(GL_ARRAY_BUFFER, VBO); + glBindBuffer(GL_ARRAY_BUFFER, VBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); + glEnableVertexAttribArray(0); while(!glfwWindowShouldClose(window)) { - glClearColor(0.2f, 0.3f, 0.3f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT); + glUseProgram(shaderProgram); + glBindVertexArray(VAO); + glDrawArrays(GL_TRIANGLES, 0, 3); glfwSwapBuffers(window); glfwPollEvents(); } @@ -56,28 +71,44 @@ void glfwError(int id, const char* description) { void framebuffer_size_callback(GLFWwindow* window, int width, int height) { glViewport(0, 0, width, height); } -unsigned int parseShader(const char *filePath) { - FILE *fp = fopen(filePath, "rb"); - size_t lSize; - char *buffer; - if(!fp) { - perror(filePath); +unsigned int parseShader(const char *filePath, const GLenum shaderType) { + bool success; + unsigned int ShaderId; + char *ShaderSrc = acl_ReadTextFile(filePath, &success); + if(!success) { + printf("Failed to read Shader: %s", filePath); + glfwTerminate(); + exit(-1); } - fseek(fp, 0L, SEEK_END); - lSize = ftell(fp); - rewind(fp); - buffer = malloc(lSize + 1); - if(!buffer) { - fclose(fp); - printf("out of memory"); - exit(1); + ShaderId = glCreateShader(shaderType); + const char *tmpShaderSrc = ShaderSrc; + glShaderSource(ShaderId, 1, &tmpShaderSrc, NULL); + glCompileShader(ShaderId); + free(ShaderSrc); + int compileSuccess; + glGetShaderiv(ShaderId, GL_COMPILE_STATUS, &compileSuccess); + if(!compileSuccess) { + char infoLog[512]; + glGetShaderInfoLog(ShaderId, 512, NULL, infoLog); + printf("Failed to compile Shader: %s Error: %s", filePath, infoLog); } - size_t readReturn = fread(buffer, lSize, 1, fp); - fclose(fp); - if(readReturn != 1) { - printf("Can't read Shader"); - exit(1); - } - printf("%s", buffer); - return 0; + return ShaderId; +} +unsigned int linkShader(unsigned int vertexShader, unsigned int fragmentShader) { + unsigned int shaderProgram = glCreateProgram(); + glAttachShader(shaderProgram, vertexShader); + glAttachShader(shaderProgram, fragmentShader); + glLinkProgram(shaderProgram); + int success; + glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); + if(!success) { + char infoLog[512]; + glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); + printf("Failed to link Shader. Error: %s", infoLog); + glfwTerminate(); + exit(-1); + } + glDeleteShader(vertexShader); + glDeleteShader(fragmentShader); + return shaderProgram; }