Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*****************************************************************//**
- * \file Triangle.cpp
- * \brief Generate a triangle using OpenGL
- *
- * \author
- * \date July 2025
- *********************************************************************/
- #include <glad/glad.h>
- #include <GLFW/glfw3.h>
- #include <iostream>
- // Screen size settings
- const unsigned int SCR_WDT{ 800 };
- const unsigned int SCR_HGT{ 600 };
- // Resizing rendering viewport
- void FramebufferSizeCallback(GLFWwindow* window, int width, int height);
- void ProcessInput(GLFWwindow* window);
- // Vertex shader source code
- const char* vertexShaderSource{
- "#version 330 core\n"
- "layout (location = 0) in vec3 aPos;\n"
- "void main()\n"
- "{\n"
- " gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
- "}\0"
- };
- // Fragment shader source code
- const char* fragmentShaderSource{
- "#version 330 core\n"
- "out vec4 fragColor;\n\n"
- "void main()\n"
- "{\n"
- " fragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
- "}\0"
- };
- int main()
- {
- // Initialize GLFW
- glfwInit();
- // Setting version
- glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
- glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
- // Core profile
- glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
- // Make window
- GLFWwindow* window = glfwCreateWindow(SCR_WDT, SCR_HGT, "I hope this works", NULL, NULL);
- if (window == NULL)
- {
- std::cout << "Failed to create GLFW window.\n" << std::endl;
- glfwTerminate();
- return -1;
- }
- glfwMakeContextCurrent(window);
- glfwSetFramebufferSizeCallback(window, FramebufferSizeCallback);
- // Initialize GLAD
- if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
- {
- std::cout << "Failed to initialize GLAD.\n" << std::endl;
- return -1;
- }
- // Error detection and handling
- int success{};
- char infoLog[512]{};
- // SHADERS
- // VERTEX SHADER---------------------------------------------------------------------
- unsigned int vertexShader; /*
- Store the address of the about-to-be-created vertex shader object*/
- vertexShader = glCreateShader(GL_VERTEX_SHADER); /*
- Create an address for a vertex shader and stores that address in vertexShader*/
- glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); /*
- Attach the shader to the shader source code*/
- glCompileShader(vertexShader); /*
- Compile the shader*/
- glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); /*
- If compilation fails, return a failure statement*/
- if (!success)
- {
- glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
- std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED.\n" << infoLog << std::endl;
- }
- // FRAGMENT SHADER-------------------------------------------------------------------
- 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);
- std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED.\n" << infoLog << std::endl;
- }
- // SHADER PROGRAM--------------------------------------------------------------------
- unsigned int shaderProgram;
- shaderProgram = glCreateProgram();
- glAttachShader(shaderProgram, vertexShader);
- glAttachShader(shaderProgram, fragmentShader); /*
- Attaching shaders to the shader program*/
- glLinkProgram(shaderProgram); /*
- Linking all shaders into the program*/
- glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
- if (!success)
- {
- glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
- std::cout << "ERROR::PROGRAM::LINKING_FAILED.\n" << infoLog << std::endl;
- }
- glDeleteShader(vertexShader);
- glDeleteShader(fragmentShader); /*
- Delete shaders after linking them to program*/
- // Vertex data
- float vertices[]{
- -0.5f, -0.5f, 0.0f,
- 0.0f, 0.5f, 0.0f,
- 0.5f, -0.5f, 0.0f
- };
- // VERETEX BUFFER OBJECT VBO AND VERTEX ARRAY OBJECT VAO--------------------------------
- unsigned int VBO; /*
- Stores address of buffer object*/
- glGenBuffers(1, &VBO); /*
- Returns one buffer object address, stores it in VBO*/
- unsigned int VAO;
- glGenVertexArrays(1, &VAO);
- glBindVertexArray(VAO);
- glBindBuffer(GL_ARRAY_BUFFER, VBO); /*
- Binds the target buffer to the given address*/
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); /*
- Copies the vertex data into the buffer object*/
- //
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
- glEnableVertexAttribArray(0);
- // WIREFRAME MODE
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- // Rendering loop
- while (!glfwWindowShouldClose(window))
- {
- // Inputs
- ProcessInput(window);
- // Rendering loop
- glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT);
- // Drawing the triangle
- glUseProgram(shaderProgram);
- /*only one triangle so need to bind vertex array every time*/
- glDrawArrays(GL_TRIANGLES, 0, 3);
- glfwPollEvents();
- glfwSwapBuffers(window);
- }
- // DEALLOCATING RESOURCES
- glDeleteVertexArrays(1, &VAO);
- glDeleteBuffers(1, &VBO);
- glDeleteProgram(shaderProgram);
- glfwTerminate();
- return 0;
- }
- void ProcessInput(GLFWwindow* window)
- {
- if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
- {
- glfwSetWindowShouldClose(window, true);
- }
- }
- void FramebufferSizeCallback(GLFWwindow* window, int width, int height)
- {
- glViewport(0, 0, width, height);
- }
Advertisement
Add Comment
Please, Sign In to add comment