diff --git a/Makefile b/Makefile index 5c94d91..5f778f1 100644 --- a/Makefile +++ b/Makefile @@ -87,6 +87,7 @@ clean: MAIN_OBJS = \ src/main.o \ src/glad.o \ + src/opengl.o \ $(patsubst %.glsl,%.glsl.o,$(wildcard src/shader/*.glsl)) \ $(GLFW) diff --git a/src/main.c b/src/main.c index d6999c4..fdf432d 100644 --- a/src/main.c +++ b/src/main.c @@ -7,9 +7,13 @@ #include "shader/vertex_color.fp.glsl.h" #include "shader/vertex_color.vp.glsl.h" +#include "opengl.h" + static int vp_width = 800; static int vp_height = 600; +typedef unsigned int uint; + void framebuffer_size_callback(GLFWwindow* window, int width, int height) { glViewport(0, 0, width, height); @@ -59,16 +63,17 @@ int main() // buffer initialization ////////////////////////////////////////////////////////////////////// - /* - unsigned int triangle_vertex_buffer = make_buffer(GL_ARRAY_BUFFER, - triangle_vertex_buffer_data, - (sizeof (triangle_vertex_buffer_data))); - */ + uint triangle_vertex_buffer = make_buffer(GL_ARRAY_BUFFER, + triangle_vertex_buffer_data, + (sizeof (triangle_vertex_buffer_data))); - /* - vertex_color.program = compile_shaders("src/vertex_color.vp.glsl", - "src/vertex_color_fp_render.fp.glsl"); - */ + uint vertex_color_program = compile_shader(src_shader_vertex_color_vp_glsl_start, + src_shader_vertex_color_vp_glsl_size, + src_shader_vertex_color_fp_glsl_start, + src_shader_vertex_color_fp_glsl_size); + glUseProgram(vertex_color_program); + uint vertex_color_attrib_position = glGetAttribLocation(vertex_color_program, "position"); + uint vertex_color_attrib_color = glGetAttribLocation(vertex_color_program, "color"); ////////////////////////////////////////////////////////////////////// // main loop @@ -82,6 +87,29 @@ int main() while(!glfwWindowShouldClose(window)) { if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) glfwSetWindowShouldClose(window, true); + + glBindBuffer(GL_ARRAY_BUFFER, triangle_vertex_buffer); + glVertexAttribPointer(vertex_color_attrib_position, + 3, + GL_FLOAT, + GL_FALSE, + (sizeof (float)) * 6, + (void*)0 + ); + glVertexAttribPointer(vertex_color_attrib_color, + 3, + GL_FLOAT, + GL_FALSE, + (sizeof (float)) * 6, + (void*)(3 * 4) + ); + glEnableVertexAttribArray(vertex_color_attrib_position); + glEnableVertexAttribArray(vertex_color_attrib_color); + + glDrawArrays(GL_TRIANGLES, 0, 3); + + glfwSwapBuffers(window); + glfwPollEvents(); } glfwTerminate(); diff --git a/src/opengl.c b/src/opengl.c index 5d71057..b41cd3d 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -1,58 +1,62 @@ -unsigned int compile_shader(const char * vp_path, const char * fp_path) +#include +#include + +#include "glad/glad.h" + +unsigned int compile_shader(const void * vp, + const int vp_length, + const void * fp, + const int fp_length) { - void * vertexShaderSource = read_file(vp_path); - unsigned int vertexShader; - vertexShader = glCreateShader(GL_VERTEX_SHADER); - glShaderSource(vertexShader, 1, (const char **)&vertexShaderSource, NULL); - glCompileShader(vertexShader); + unsigned int vertex_shader; + vertex_shader = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vertex_shader, 1, (const char **)&vp, &vp_length); + glCompileShader(vertex_shader); { int success; - char infoLog[512]; - glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); + char info_log[512]; + glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success); if(!success) { - glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); - printf("vertex shader compile failed:\n%s\n", infoLog); - } - } - free(vertexShaderSource); - - void * fragmentShaderSource = read_file(fp_path); - unsigned int fragmentShader; - fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); - glShaderSource(fragmentShader, 1, (const char **)&fragmentShaderSource, NULL); - glCompileShader(fragmentShader); - { - int success; - char infoLog[512]; - glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); - if(!success) { - glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); - printf("fragment shader compile failed:\n%s\n", infoLog); - } - } - free(fragmentShaderSource); - - unsigned int shaderProgram; - shaderProgram = glCreateProgram(); - - glAttachShader(shaderProgram, vertexShader); - glAttachShader(shaderProgram, fragmentShader); - glLinkProgram(shaderProgram); - - { - int success; - char infoLog[512]; - glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); - if(!success) { - glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); - printf("program link failed:\n%s\n", infoLog); + glGetShaderInfoLog(vertex_shader, 512, NULL, info_log); + fprintf(stderr, "vertex shader compile failed:\n%s\n", info_log); } } - glDeleteShader(vertexShader); - glDeleteShader(fragmentShader); + unsigned int fragment_shader; + fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fragment_shader, 1, (const char **)&fp, &fp_length); + glCompileShader(fragment_shader); + { + int success; + char info_log[512]; + glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success); + if(!success) { + glGetShaderInfoLog(fragment_shader, 512, NULL, info_log); + fprintf(stderr, "fragment shader compile failed:\n%s\n", info_log); + } + } - return shaderProgram; + unsigned int shader_program; + shader_program = glCreateProgram(); + + glAttachShader(shader_program, vertex_shader); + glAttachShader(shader_program, fragment_shader); + glLinkProgram(shader_program); + + { + int success; + char info_log[512]; + glGetProgramiv(shader_program, GL_LINK_STATUS, &success); + if(!success) { + glGetProgramInfoLog(shader_program, 512, NULL, info_log); + fprintf(stderr, "program link failed:\n%s\n", info_log); + } + } + + glDeleteShader(vertex_shader); + glDeleteShader(fragment_shader); + + return shader_program; } int make_buffer(unsigned int target, diff --git a/src/opengl.h b/src/opengl.h new file mode 100644 index 0000000..3bbaed1 --- /dev/null +++ b/src/opengl.h @@ -0,0 +1,8 @@ +unsigned int compile_shader(const void * vp, + const size_t vp_length, + const void * fp, + const size_t fp_length); + +int make_buffer(unsigned int target, + const void * data, + size_t size);