diff options
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 85 |
1 files changed, 26 insertions, 59 deletions
@@ -1,3 +1,4 @@ +#include "shader.h" #include <glad/glad.h> #include <GLFW/glfw3.h> #include <stdio.h> @@ -40,10 +41,10 @@ main([[maybe_unused]] int argc, [[maybe_unused]] char **argv) glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); static const float verts[] = { - 0.5f, 0.5f, 0.0f, // top right - 0.5f, -0.5f, 0.0f, // bottom right - -0.5f, -0.5f, 0.0f, // bottom left - -0.5f, 0.5f, 0.0f // top left + 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, // top right + 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, // bottom right + -0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, // bottom left + -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f // top left }; static const GLuint indices[] = { 0, 1, 3, // first triangle @@ -52,57 +53,6 @@ main([[maybe_unused]] int argc, [[maybe_unused]] char **argv) GLuint VBO; glGenBuffers(1, &VBO); - const GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER); - if (vertex_shader == 0) { - fprintf(stderr, "glCreateShader failed\n"); - return 1; - } - const char *const vertex_source = (const char*)src_vertex_glsl; - glShaderSource(vertex_shader, 1, &vertex_source, NULL); - glCompileShader(vertex_shader); - int success; - glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success); - if (!success) { - char info_log[512]; - glGetShaderInfoLog(vertex_shader, 512, NULL, info_log); - fprintf(stderr, "glCompileShader failed:\n%s\n", info_log); - return 1; - } - - const GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); - if (fragment_shader == 0) { - fprintf(stderr, "glCreateShader failed\n"); - return 1; - } - const char *const fragment_source = (const char*)src_fragment_glsl; - glShaderSource(fragment_shader, 1, &fragment_source, NULL); - glCompileShader(fragment_shader); - glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success); - if (!success) { - char info_log[512]; - glGetShaderInfoLog(fragment_shader, 512, NULL, info_log); - fprintf(stderr, "glCompileShader failed:\n%s\n", info_log); - return 1; - } - - const GLuint shader_program = glCreateProgram(); - if (shader_program == 0) { - fprintf(stderr, "glCreateProgram failed\n"); - return 1; - } - glAttachShader(shader_program, vertex_shader); - glAttachShader(shader_program, fragment_shader); - glLinkProgram(shader_program); - glDeleteShader(vertex_shader); - glDeleteShader(fragment_shader); - glGetProgramiv(shader_program, GL_LINK_STATUS, &success); - if (!success) { - char info_log[512]; - glGetProgramInfoLog(shader_program, 512, NULL, info_log); - fprintf(stderr, "glLinkProgram failed:\n%s\n", info_log); - return 1; - } - GLuint EBO; glGenBuffers(1, &EBO); @@ -112,13 +62,30 @@ main([[maybe_unused]] int argc, [[maybe_unused]] char **argv) glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), NULL); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices) / 2, indices, GL_STATIC_DRAW); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float))); + glEnableVertexAttribArray(1); + + Shader shader; + if (shader_init(&shader, + (const char *)src_vertex_glsl, + (const char *)src_fragment_glsl)) + { + fprintf(stderr, "shader_init failed\n"); + return 1; + } + + const GLint vertex_color_location = + shader_uniform_location(&shader, "ourColor"); - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); while (!glfwWindowShouldClose(window)) { - glUseProgram(shader_program); + shader_use(&shader); + const int r = 0;//rand(); + glUniform4f(vertex_color_location, + !(r&1), !(r&2), !(r&4), !(r&8)); glBindVertexArray(VAO); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); |