#include #include #include #include #include #include static std::string ParseShader(const std::string filePath) { std::ifstream stream(filePath); std::string line; std::stringstream ss; while (getline(stream, line)) { ss << line << "\n"; } return ss.str(); } static unsigned int CompileShader(unsigned int type, const std::string &source) { unsigned int id = glCreateShader(type); const char *src = source.c_str(); glShaderSource(id, 1, &src, nullptr); glCompileShader(id); int result; glGetShaderiv(id, GL_COMPILE_STATUS, &result); if (result == GL_FALSE) { int lenght; glGetShaderiv(id, GL_INFO_LOG_LENGTH, &lenght); char *message = (char *)alloca(lenght + sizeof(char)); glGetShaderInfoLog(id, lenght, &lenght, message); std::cout << "Failed to compile " << (type == GL_VERTEX_SHADER ? "vertex" : "fragment") << " shader!" << std::endl; std::cout << message << std::endl; glDeleteShader(id); return 0; } return id; } static unsigned int CreateShader(const std::string &vertexShader, const std::string &fragmentShader) { unsigned int program = glCreateProgram(); unsigned int vs = CompileShader(GL_VERTEX_SHADER, vertexShader); unsigned int fs = CompileShader(GL_FRAGMENT_SHADER, fragmentShader); glAttachShader(program, vs); glAttachShader(program, fs); glLinkProgram(program); glValidateProgram(program); glDeleteShader(vs); glDeleteShader(fs); return program; } int main() { GLFWwindow *window; /* Initialize the library */ if (!glfwInit()) return -1; /* Create a windowed mode window and its OpenGL context */ window = glfwCreateWindow(1280, 720, "Hello World", NULL, NULL); if (!window) { glfwTerminate(); return -1; } /* Make the window's context current */ glfwMakeContextCurrent(window); if (glewInit() != GLEW_OK) { std::cout << "Error!" << std::endl; } std::cout << glGetString(GL_VERSION) << std::endl; float positions[6] = { -0.5f, -0.5f, 0.0f, 0.5f, 0.5f, -0.5f}; unsigned int buffer; glGenBuffers(1, &buffer); glBindBuffer(GL_ARRAY_BUFFER, buffer); glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), positions, GL_STATIC_DRAW); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0); glEnableVertexAttribArray(0); std::string vertexShader = ParseShader("Shaders/Vertex.glsl"); std::cout << "VERTEX:" << std::endl; std::cout << vertexShader << std::endl; std::string fragmentShader = ParseShader("Shaders/Fragment.glsl"); std::cout << "FRAGMENT:" << std::endl; std::cout << fragmentShader << std::endl; unsigned int shader = CreateShader(vertexShader, fragmentShader); glUseProgram(shader); /* Loop until the user closes the window */ while (!glfwWindowShouldClose(window)) { /* Render here */ glClear(GL_COLOR_BUFFER_BIT); glDrawArrays(GL_TRIANGLES, 0, 3); /* Swap front and back buffers */ glfwSwapBuffers(window); /* Poll for and process events */ glfwPollEvents(); } glDeleteProgram(shader); glfwTerminate(); return 0; }