diff options
author | jvech <jmvalenciae@unal.edu.co> | 2022-08-17 07:11:39 -0500 |
---|---|---|
committer | jvech <jmvalenciae@unal.edu.co> | 2022-08-17 07:11:39 -0500 |
commit | ebb66ddbb17a3b82f7632a07fa4db60223b9e55a (patch) | |
tree | b36aa617c284e5bac857183a7f0d5f695a782696 | |
parent | 5d2c6f0a266d1ba8761240a044d35079dcadf736 (diff) |
feat: Hello Triangle Done
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | TODO | 3 | ||||
-rw-r--r-- | src/main.c | 105 | ||||
-rw-r--r-- | src/main.h | 1 |
4 files changed, 97 insertions, 13 deletions
@@ -1,2 +1,3 @@ objs/ mverse +tags @@ -1,3 +1,4 @@ Learning * Make a Hello Window -- Make a Hello Triangle +* Make a Hello Triangle +- Make a Shader Loader Library @@ -8,22 +8,38 @@ #include "main.h" -static void sysError(const char *msg); +const char *vertexShaderSource = \ +"#version 330 core\n" +"layout (location = 0) in vec3 aPos;\n" +"void main()\n" +"{\n" +" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n" +"}\0"; + +const char *fragmentShaderSource = \ +"#version 330 core\n" +"out vec4 FragColor;\n" +"void main()\n" +"{\n" +" FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" +"}\0"; + +float vertices[] = { + -0.5f, -0.5f, 0.0f, + 0.5f, -0.5f, 0.0f, + 0.0f, 0.5f, 0.0f +}; + +//static void sysError(const char *msg); static void userError(const char *msg, const char *detail); static void glfw_size_callback(GLFWwindow *window, int width, int height); static void processInput(GLFWwindow *window, struct Background *c); - -void -sysError(const char *msg) -{ - perror(msg); - exit(1); -} +static void checkGLSuccess(unsigned int compiledShader, unsigned int shaderStep); void userError(const char *msg, const char *detail) { - fprintf(stderr, "%s : %s\n", msg, detail); + fprintf(stderr, "%s: %s\n", msg, detail); exit(1); } @@ -48,6 +64,34 @@ processInput(GLFWwindow *window, struct Background *c) } } +void +checkGLSuccess(unsigned int shaderBinary, unsigned int shaderStep) +{ + int success; + char infoLog[512]; + switch (shaderStep) { + case 0: + glGetShaderiv(shaderBinary, GL_COMPILE_STATUS, &success); + if (!success) { + glGetShaderInfoLog(shaderBinary, 512, NULL, infoLog); + userError("glCompileShader() ERROR", infoLog); + } + break; + + case 1: + glGetProgramiv(shaderBinary, GL_LINK_STATUS, &success); + + if (!success) { + glGetProgramInfoLog(shaderBinary, 512, NULL, infoLog); + userError("glLinkProgram() ERROR", infoLog); + } + break; + + default: + break; + } +} + int main() { GLFWwindow *window; @@ -76,15 +120,52 @@ int main() struct Background colors = {.R = 0.0, .G = 0.0, .B = 0.0, .A = 0.0}; + unsigned int VBO, VAO; + glGenVertexArrays(1, &VAO); + glBindVertexArray(VAO); + + glGenBuffers(1, &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); + + unsigned int vertexShader, fragmentShader, shaderProgram; + vertexShader = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); + glCompileShader(vertexShader); + checkGLSuccess(vertexShader, 0); + printf("Vertex Compiled\n"); + + fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); + glCompileShader(fragmentShader); + checkGLSuccess(fragmentShader, 0); + printf("Fragment Compiled\n"); + + shaderProgram = glCreateProgram(); + glAttachShader(shaderProgram, vertexShader); + glAttachShader(shaderProgram, fragmentShader); + glLinkProgram(shaderProgram); + checkGLSuccess(shaderProgram, 1); + + glDeleteShader(vertexShader); + glDeleteShader(fragmentShader); + while (!glfwWindowShouldClose(window)) { - glClear(GL_COLOR_BUFFER_BIT); + processInput(window, &colors); + glClearColor(colors.R, colors.G, colors.B, colors.A); + glClear(GL_COLOR_BUFFER_BIT); + + glUseProgram(shaderProgram); + glBindVertexArray(VAO); + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + glDrawArrays(GL_TRIANGLES, 0, 3); - processInput(window, &colors); glfwSwapBuffers(window); glfwPollEvents(); } - glfwTerminate(); return 0; } @@ -1,3 +1,4 @@ struct Background { float R, G, B, A; }; + |