diff --git a/README.md b/README.md index 5e62316..25948bf 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ # learn-opengl -I want to learn more about opengl, so here we go \ No newline at end of file +I want to learn more about opengl, so here we go. + +Learning from https://learnopengl.com \ No newline at end of file diff --git a/learn-opengl.code-workspace b/learn-opengl.code-workspace new file mode 100644 index 0000000..876a149 --- /dev/null +++ b/learn-opengl.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": {} +} \ No newline at end of file diff --git a/learning b/learning new file mode 100755 index 0000000..181d68d Binary files /dev/null and b/learning differ diff --git a/learning.cpp b/learning.cpp new file mode 100644 index 0000000..e52edb8 --- /dev/null +++ b/learning.cpp @@ -0,0 +1,112 @@ +#include +#include +#include +#include +#include +#include + +using namespace std; + +const char *VERTEX_SHADER = "#version 330 core\n" + "layout (location = 0) in vec3 aPos;\n" + "void main(){\n" + " gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n" + "}\0"; +const char *FRAG_SHADER = "#version 330 core\n" + "out vec4 FragColor;\n" + "void main(){\n" + "FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" + "}\0"; + +void resizeWindow(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(){ + glfwInit(); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + + GLFWwindow* window = glfwCreateWindow(800, 600, "Learning OpenGL", NULL, NULL); + if (window == NULL){ + write(1, "Failed to create GLFW window\n", 29); + glfwTerminate(); + return -1; + } + glfwMakeContextCurrent(window); + if (!gladLoadGLLoader((GLADloadproc) glfwGetProcAddress)){ + write(1, "Failed to initialize GLAD\n", 26); + return -1; + } + + glViewport(0, 0, 800, 600); + glfwSetFramebufferSizeCallback(window, resizeWindow); + + float vertices[] = { + -0.5f, -0.5f, 0.0f, + 0.5f, -0.5f, 0.0f, + 0.0f, 0.5f, 0.0f + }; + unsigned int VBO; + glGenBuffers(1, &VBO); + glBindBuffer(GL_ARRAY_BUFFER, VBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + + unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vertexShader, 1, &VERTEX_SHADER, NULL); + glCompileShader(vertexShader); + int success; + glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); + if (!success){ + char infoLog[512]; + glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); + std::cout << "ERROR: Vertex shader compilation failed\n" << infoLog; + } + + unsigned int fragmentShader = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(fragmentShader, 1, &FRAG_SHADER, NULL); + glCompileShader(fragmentShader); + glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); + if (!success){ + char infoLog[512]; + glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); + std::cout << "ERROR: Fragment shader compilation failed\n" << infoLog; + } + + unsigned int shader; + shader = glCreateProgram(); + glAttachShader(shader, vertexShader); + glAttachShader(shader, fragmentShader); + glLinkProgram(shader); + glGetProgramiv(shader, GL_LINK_STATUS, &success); + if (!success){ + char infoLog[512]; + glGetProgramInfoLog(shader, 512, NULL, infoLog); + std::cout << "ERROR: Failed to link shader\n" << infoLog; + } + glDeleteShader(vertexShader); + glDeleteShader(fragmentShader); + + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); + glEnableVertexAttribArray(0); + + while (!glfwWindowShouldClose(window)){ + processInput(window); + + glClearColor(0.2f, 0.3f, 0.3f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + glfwSwapBuffers(window); + glfwPollEvents(); + } + + glfwTerminate(); + return 0; +} \ No newline at end of file diff --git a/lib/glad.o b/lib/glad.o new file mode 100644 index 0000000..a320fd4 Binary files /dev/null and b/lib/glad.o differ diff --git a/makefile b/makefile new file mode 100644 index 0000000..6ddee0a --- /dev/null +++ b/makefile @@ -0,0 +1,4 @@ +all: + gcc -Wall learning.cpp -o learning lib/glad.o -lglfw -lGL -lX11 -lpthread -lXrandr -lXi -ldl +clean: + rm -f learning \ No newline at end of file diff --git a/shaders/default.frag b/shaders/default.frag new file mode 100644 index 0000000..1f4ec0a --- /dev/null +++ b/shaders/default.frag @@ -0,0 +1,6 @@ +#version 330 core +out vec4 FragColor; + +void main(){ + FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f); +} \ No newline at end of file diff --git a/shaders/default.vert b/shaders/default.vert new file mode 100644 index 0000000..611b8bd --- /dev/null +++ b/shaders/default.vert @@ -0,0 +1,6 @@ +#version 330 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