commit f0ac2901e7413a7376d5b23d84152926e9f543b9 Author: Nigel Date: Sun Feb 6 12:52:11 2022 +0100 LearnOpenGL tutorial. Made it up to Shaders diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f38fb1c --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +lib/ +build/ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f04486f --- /dev/null +++ b/Makefile @@ -0,0 +1,12 @@ +CC = g++ +CFLAGS = -std=c++17 -O2 +LDFLAGS = -lglfw3 -lGL -ldl -lpthread -lX11 -lXxf86vm -lXrandr -lXi +OUT_NAME = LearnOpenGL + +build: src/main.cpp + mkdir -p build/ + $(CC) $(CFLAGS) -Ilib/GLAD/include -Ilib/glfw/include -o build/$(OUT_NAME) lib/GLAD/src/glad.c src/main.cpp $(LDFLAGS) + + +run: build/$(OUT_NAME) + ./build/$(OUT_NAME) \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..7eda75d --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,172 @@ +#include + +#include +#include + + +void framebuffer_size_callback(GLFWwindow* window, int width, int height) { + glViewport(0,0, width, height); +} + +void processInput( GLFWwindow* window){ + if(glfwGetKey(window,GLFW_KEY_ESCAPE) == GLFW_PRESS) + glfwSetWindowShouldClose(window, true); + +} + +int main() { + printf("Hello OpenGL!"); + glfwInit(); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + + + GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL); + if( window == NULL){ + printf("Failed to create GLFW window!"); + glfwTerminate(); + return -1; + } + glfwMakeContextCurrent(window); + + if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){ + printf("Failed to initialize GLAD!"); + return -1; + } + + glViewport(0,0, 800, 600); + glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); + + + glClearColor(0.2f, 0.3f, 0.3f, 1.0f); + + // TODO: Load from disk + const char* vertextShaderSource = + "#version 460 core\n" + "layout (location=0) in vec3 aPos;\n" + "void main(){\n" + "gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n" + "}\n"; + + unsigned int vertexShader; + vertexShader = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vertexShader, 1, &vertextShaderSource, NULL); + glCompileShader(vertexShader); + + int success; + char infolog[512]; + glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); + + if(!success){ + glGetShaderInfoLog(vertexShader, 512, NULL, infolog); + printf ( "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n %s", infolog); + + } + + + //TODO: load from disk + const char* fragmentShaderSource = + "#version 330 core\n" + "out vec4 FragColor;\n" + "void main(){\n" + "FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" + "}\n"; + + unsigned int fragmentShader; + fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); + glCompileShader(fragmentShader); + + glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); + + if(!success){ + glGetShaderInfoLog(fragmentShader, 512 ,NULL,infolog); + printf("ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n %s", infolog); + } + + + + unsigned int shaderProgram; + shaderProgram = glCreateProgram(); + + glAttachShader(shaderProgram, vertexShader); + glAttachShader(shaderProgram, fragmentShader); + glLinkProgram(shaderProgram); + + glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); + if(!success) { + glGetProgramInfoLog(shaderProgram, 512, NULL, infolog); + printf("ERROR::SHADER_PROGRAM::LINKING_FAILED\n %s", infolog); + } + + + glDeleteShader(vertexShader); + glDeleteShader(fragmentShader); + + + + + float vertices[] = { + 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 + }; + + unsigned int indices[] = { + 0, 1,3, // first triangle + 1,2,3 // second triangle + }; + + // Vertex buffer objects!! + unsigned int VBO, VAO, EBO; + glGenVertexArrays(1, &VAO); + glGenBuffers(1, &VBO); + glGenBuffers(1, &EBO); + + glBindVertexArray(VAO); + + glBindBuffer(GL_ARRAY_BUFFER, VBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, 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), (void*)0); + glEnableVertexAttribArray(0); + + glBindBuffer(GL_ARRAY_BUFFER, 0); + + glBindVertexArray(0); + + // WireFrame mode + // glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + + while(!glfwWindowShouldClose(window)) + { + processInput(window); + + glClear(GL_COLOR_BUFFER_BIT); + + glUseProgram(shaderProgram); + glBindVertexArray(VAO); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); + glDrawElements(GL_TRIANGLES, 6,GL_UNSIGNED_INT, 0); + glBindVertexArray(0); + + glfwSwapBuffers(window); + glfwPollEvents(); + } + + glDeleteVertexArrays(1, &VAO); + glDeleteBuffers(1, &VBO); + glDeleteProgram(shaderProgram); + + glfwTerminate(); + + return 0; + + +} \ No newline at end of file diff --git a/src/vertex.shader b/src/vertex.shader new file mode 100644 index 0000000..470ba71 --- /dev/null +++ b/src/vertex.shader @@ -0,0 +1,7 @@ +#version 460 core +layout (location=0) in vec3 aPos; + +void main(){ + gl_Position = vec4(aPos.x, aPos.y, aPos.z 1.0); + +} \ No newline at end of file