diff --git a/headers/shapes.h b/headers/shapes.h new file mode 100644 index 0000000..b8cc635 --- /dev/null +++ b/headers/shapes.h @@ -0,0 +1,16 @@ +float tri_vertices[] = {-0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, 0.5f, 0.0f}; + + +const char *basicVertexShaderSource = "#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 *basicFragmentShaderSource = "#version 330 core\n" + "out vec4 FragColor;\n" + "void main()\n" + "{\n" + " FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" + "}\n"; diff --git a/src/main.cpp b/src/main.cpp index 3f26e48..d1a4991 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,10 +1,18 @@ #include #include #include +#include +#include #define UNUSED(x) (void)(x) -void framebuffer_size_callback(GLFWwindow* window, int width, int height); +void processInput(GLFWwindow *window); +void framebuffer_size_callback(GLFWwindow *window, int width, int height); +unsigned int shaderCMPL(GLenum type, const char *src); +void shaderERR(unsigned int shader); +unsigned int shaderProgramCMPL(const char *vertexSource, + const char *fragmentSource); +void shaderProgramERR(unsigned int shaderProgram); int main(void) { int tmp = 0; @@ -24,17 +32,100 @@ int main(void) { glViewport(0, 0, 800, 600); glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); - while(!glfwWindowShouldClose(window)) - { - glfwSwapBuffers(window); - glfwPollEvents(); - } + unsigned int VBO,VAO; + glGenVertexArrays(1, &VAO); + glBindVertexArray(VAO); + + glGenBuffers(1, &VBO); + glBindBuffer(GL_ARRAY_BUFFER, VBO); + + glBufferData(GL_ARRAY_BUFFER, sizeof(tri_vertices), tri_vertices, + GL_STATIC_DRAW); + + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void *)0); + glEnableVertexAttribArray(0); + + unsigned int shaderProgram = + shaderProgramCMPL(basicVertexShaderSource, basicFragmentShaderSource); + glUseProgram(shaderProgram); + + while (!glfwWindowShouldClose(window)) { + processInput(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(); + } glfwTerminate(); return 0; } -void framebuffer_size_callback(GLFWwindow* window, int width, int height) { +void processInput(GLFWwindow *window) { + if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) + glfwSetWindowShouldClose(window, true); +} + +void framebuffer_size_callback(GLFWwindow *window, int width, int height) { UNUSED(window); glViewport(0, 0, width, height); } + +unsigned int shaderCMPL(GLenum type, const char *src) { + unsigned int shader; + shader = glCreateShader(type); + glShaderSource(shader, 1, &src, NULL); + glCompileShader(shader); + return shader; +} + +void shaderERR(unsigned int shader) { + int success; + char infoLog[512]; + glGetShaderiv(shader, GL_COMPILE_STATUS, &success); + + if (!success) { + glGetShaderInfoLog(shader, 512, NULL, infoLog); + std::cout << "ERROR::SHADER::COMPILATION_FAILED\n" << infoLog << std::endl; + } +} + +unsigned int shaderProgramCMPL(const char *vertexSource, + const char *fragmentSource) { + unsigned int vertexShader; + vertexShader = shaderCMPL(GL_VERTEX_SHADER, vertexSource); + shaderERR(vertexShader); + + unsigned int fragmentShader; + fragmentShader = shaderCMPL(GL_FRAGMENT_SHADER, fragmentSource); + shaderERR(fragmentShader); + + unsigned int shaderProgram; + shaderProgram = glCreateProgram(); + + glAttachShader(shaderProgram, vertexShader); + glAttachShader(shaderProgram, fragmentShader); + glLinkProgram(shaderProgram); + shaderProgramERR(shaderProgram); + glDeleteShader(vertexShader); + glDeleteShader(fragmentShader); + + return shaderProgram; +} + +void shaderProgramERR(unsigned int shaderProgram) { + int success; + char infoLog[512]; + glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); + + if (!success) { + glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); + std::cout << "ERROR::SHADER::PROGRAM::FAILED\n" << infoLog << std::endl; + } +}