From ebb66ddbb17a3b82f7632a07fa4db60223b9e55a Mon Sep 17 00:00:00 2001 From: jvech Date: Wed, 17 Aug 2022 07:11:39 -0500 Subject: feat: Hello Triangle Done --- src/main.c | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 93 insertions(+), 12 deletions(-) (limited to 'src/main.c') diff --git a/src/main.c b/src/main.c index 948932e..2d296a8 100644 --- a/src/main.c +++ b/src/main.c @@ -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; } -- cgit v1.2.3-70-g09d2