#include #include #include #include #include #include GLFWwindow* StartGLU(); void CreateVBOVAO(GLuint& VAO, GLuint& VBO, const float* vertices, size_t vertexCount); GLuint CreateShaderProgram(const char* vertexSource, const char* fragmentSource); const char* vertexShaderSource = R"glsl( #version 330 core layout (location = 0) in vec3 aPos; void main() { gl_Position = vec4(aPos, 1.0); } )glsl"; const char* fragmentShaderSource = R"glsl( #version 330 core out vec4 FragColor; void main() { FragColor = vec4(1.0, 0.5, 0.2, 1.0); // Orange color } )glsl"; int main() { GLFWwindow* window = StartGLU(); GLuint shaderProgram = CreateShaderProgram(vertexShaderSource, fragmentShaderSource); //vertex data float vertices[] = { -0.5f, -0.5f, 0.0f, // Bottom left 0.5f, -0.5f, 0.0f, // Bottom right 0.0f, 0.5f, 0.0f // Top center }; // Create VAO and VBO GLuint VAO, VBO; CreateVBOVAO(VAO, VBO, vertices, sizeof(vertices) / sizeof(float)); while (!glfwWindowShouldClose(window)) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUseProgram(shaderProgram); glBindVertexArray(VAO); glDrawArrays(GL_TRIANGLES, 0, 3); glfwSwapBuffers(window); glfwPollEvents(); } glDeleteVertexArrays(1, &VAO); glDeleteBuffers(1, &VBO); glDeleteProgram(shaderProgram); glfwTerminate(); return 0; } GLFWwindow* StartGLU() { if (!glfwInit()) { std::cout << "Failed to initialize GLFW, panic" << std::endl; return nullptr; } GLFWwindow* window = glfwCreateWindow(800, 600, "3D_TEST", NULL, NULL); if (!window) { std::cerr << "Failed to create GLFW window." << std::endl; glfwTerminate(); return nullptr; } glfwMakeContextCurrent(window); glewExperimental = GL_TRUE; if (glewInit() != GLEW_OK) { std::cerr << "Failed to initialize GLEW." << std::endl; glfwTerminate(); return nullptr; } glEnable(GL_DEPTH_TEST); return window; } GLuint CreateShaderProgram(const char* vertexSource, const char* fragmentSource) { // Vertex shader GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShader, 1, &vertexSource, nullptr); glCompileShader(vertexShader); GLint success; glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); if (!success) { char infoLog[512]; glGetShaderInfoLog(vertexShader, 512, nullptr, infoLog); std::cerr << "Vertex shader compilation failed: " << infoLog << std::endl; } // Fragment shader GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader, 1, &fragmentSource, nullptr); glCompileShader(fragmentShader); glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); if (!success) { char infoLog[512]; glGetShaderInfoLog(fragmentShader, 512, nullptr, infoLog); std::cerr << "Fragment shader compilation failed: " << infoLog << std::endl; } // Shader program GLuint shaderProgram = glCreateProgram(); glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); glLinkProgram(shaderProgram); glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); if (!success) { char infoLog[512]; glGetProgramInfoLog(shaderProgram, 512, nullptr, infoLog); std::cerr << "Shader program linking failed: " << infoLog << std::endl; } glDeleteShader(vertexShader); glDeleteShader(fragmentShader); return shaderProgram; } void CreateVBOVAO(GLuint& VAO, GLuint& VBO, const float* vertices, size_t vertexCount) { //VAO glGenVertexArrays(1, &VAO); glBindVertexArray(VAO); //VBO glGenBuffers(1, &VBO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, vertexCount * sizeof(float), vertices, GL_STATIC_DRAW); //vertex attribute pointers glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); glBindVertexArray(0); }