diff --git a/src/main.cpp b/src/main.cpp index 5bc5493..34c6b6f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,4 +1,114 @@ +#include +#include +#include + +// vertex shader +const char* vertexShaderSource = R"( +#version 330 core +layout(location = 0) in vec3 aPos; +void main() +{ + gl_Position = vec4(aPos, 1.0); +} +)"; + +// fragment shader +const char* fragmentShaderSource = R"( +#version 330 core +out vec4 FragColor; +void main() +{ + FragColor = vec4(0.8, 0.3, 0.02, 1.0); +} +)"; + int main() { + if(!glfwInit()) + { + std::cerr << "Failed to initialize GLFW\n"; + return -1; + } + + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + +#ifdef __APPLE__ + glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); +#endif + + GLFWwindow* window = glfwCreateWindow(800, 600, "Triangle Test", nullptr, nullptr); + if(!window) + { + std::cerr << "Failed to create GLFW window\n"; + glfwTerminate(); + return -1; + } + glfwMakeContextCurrent(window); + + if(glewInit() != GLEW_OK) + { + std::cerr << "Failed to initialize GLEW\n"; + return -1; + } + + // --- Vertex data --- + float vertices[] = + { + 0.0f, 0.5f, 0.0f, // top + 0.5f, -0.5f, 0.0f, // right + -0.5f, -0.5f, 0.0f // left + }; + + GLuint VAO, VBO; + glGenVertexArrays(1, &VAO); + glGenBuffers(1, &VBO); + + glBindVertexArray(VAO); + + glBindBuffer(GL_ARRAY_BUFFER, VBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(float), (void*)0); + glEnableVertexAttribArray(0); + + // --- Compile shaders --- + GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vertexShader, 1, &vertexShaderSource, nullptr); + glCompileShader(vertexShader); + + GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fragmentShader, 1, &fragmentShaderSource, nullptr); + glCompileShader(fragmentShader); + + GLuint shaderProgram = glCreateProgram(); + glAttachShader(shaderProgram, vertexShader); + glAttachShader(shaderProgram, fragmentShader); + glLinkProgram(shaderProgram); + + glDeleteShader(vertexShader); + glDeleteShader(fragmentShader); + + // --- Render loop --- + while(!glfwWindowShouldClose(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(); + } + + glDeleteVertexArrays(1, &VAO); + glDeleteBuffers(1, &VBO); + + glfwDestroyWindow(window); + glfwTerminate(); + return 0; } \ No newline at end of file