lambgravy

OpenGL code that works in a project named Triangle and nowhere else.

Jul 4th, 2025
98
0
141 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.53 KB | None | 0 0
  1. /*****************************************************************//**
  2.  * \file   Triangle.cpp
  3.  * \brief  Generate a triangle using OpenGL
  4.  *
  5.  * \author
  6.  * \date   July 2025
  7.  *********************************************************************/
  8.  
  9. #include <glad/glad.h>
  10. #include <GLFW/glfw3.h>
  11.  
  12. #include <iostream>
  13.  
  14. // Screen size settings
  15. const unsigned int SCR_WDT{ 800 };
  16. const unsigned int SCR_HGT{ 600 };
  17.  
  18. // Resizing rendering viewport
  19. void FramebufferSizeCallback(GLFWwindow* window, int width, int height);
  20.  
  21. void ProcessInput(GLFWwindow* window);
  22.  
  23.  
  24. // Vertex shader source code
  25. const char* vertexShaderSource{
  26.     "#version 330 core\n"
  27.     "layout (location = 0) in vec3 aPos;\n"
  28.     "void main()\n"
  29.     "{\n"
  30.     "   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
  31.     "}\0"
  32. };
  33.  
  34.  
  35. // Fragment shader source code
  36. const char* fragmentShaderSource{
  37.     "#version 330 core\n"
  38.     "out vec4 fragColor;\n\n"
  39.     "void main()\n"
  40.     "{\n"
  41.     "   fragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
  42.     "}\0"
  43. };
  44.  
  45. int main()
  46. {
  47.     // Initialize GLFW
  48.     glfwInit();
  49.  
  50.     // Setting version
  51.     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
  52.     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
  53.  
  54.     // Core profile
  55.     glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  56.  
  57.  
  58.     // Make window
  59.     GLFWwindow* window = glfwCreateWindow(SCR_WDT, SCR_HGT, "I hope this works", NULL, NULL);
  60.  
  61.     if (window == NULL)
  62.     {
  63.         std::cout << "Failed to create GLFW window.\n" << std::endl;
  64.         glfwTerminate();
  65.         return -1;
  66.     }
  67.  
  68.     glfwMakeContextCurrent(window);
  69.  
  70.  
  71.     glfwSetFramebufferSizeCallback(window, FramebufferSizeCallback);
  72.  
  73.  
  74.     // Initialize GLAD
  75.     if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
  76.     {
  77.         std::cout << "Failed to initialize GLAD.\n" << std::endl;
  78.         return -1;
  79.     }
  80.  
  81.    
  82.     // Error detection and handling
  83.     int success{};
  84.     char infoLog[512]{};
  85.  
  86.    
  87.    
  88.     // SHADERS
  89.     // VERTEX SHADER---------------------------------------------------------------------
  90.     unsigned int vertexShader; /*
  91.     Store the address of the about-to-be-created vertex shader object*/
  92.  
  93.     vertexShader = glCreateShader(GL_VERTEX_SHADER); /*
  94.     Create an address for a vertex shader and stores that address in vertexShader*/
  95.  
  96.     glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); /*
  97.     Attach the shader to the shader source code*/
  98.  
  99.     glCompileShader(vertexShader); /*
  100.     Compile the shader*/
  101.  
  102.     glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); /*
  103.     If compilation fails, return a failure statement*/
  104.     if (!success)
  105.     {
  106.         glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
  107.         std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED.\n" << infoLog << std::endl;
  108.     }
  109.  
  110.     // FRAGMENT SHADER-------------------------------------------------------------------
  111.     unsigned int fragmentShader;
  112.  
  113.     fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  114.  
  115.     glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
  116.  
  117.     glCompileShader(fragmentShader);
  118.  
  119.     glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
  120.  
  121.     if (!success)
  122.     {
  123.         glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
  124.         std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED.\n" << infoLog << std::endl;
  125.     }
  126.  
  127.  
  128.  
  129.  
  130.     // SHADER PROGRAM--------------------------------------------------------------------
  131.     unsigned int shaderProgram;
  132.     shaderProgram = glCreateProgram();
  133.  
  134.     glAttachShader(shaderProgram, vertexShader);
  135.     glAttachShader(shaderProgram, fragmentShader); /*
  136.     Attaching shaders to the shader program*/
  137.  
  138.     glLinkProgram(shaderProgram); /*
  139.     Linking all shaders into the program*/
  140.  
  141.     glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
  142.     if (!success)
  143.     {
  144.         glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
  145.         std::cout << "ERROR::PROGRAM::LINKING_FAILED.\n" << infoLog << std::endl;
  146.     }
  147.  
  148.  
  149.     glDeleteShader(vertexShader);
  150.     glDeleteShader(fragmentShader); /*
  151.     Delete shaders after linking them to program*/
  152.  
  153.  
  154.     // Vertex data
  155.     float vertices[]{
  156.         -0.5f, -0.5f,  0.0f,
  157.          0.0f,  0.5f,  0.0f,
  158.          0.5f, -0.5f,  0.0f
  159.     };
  160.  
  161.  
  162.     // VERETEX BUFFER OBJECT VBO AND VERTEX ARRAY OBJECT VAO--------------------------------
  163.     unsigned int VBO; /*
  164.     Stores address of buffer object*/
  165.  
  166.     glGenBuffers(1, &VBO); /*
  167.     Returns one buffer object address, stores it in VBO*/
  168.  
  169.     unsigned int VAO;
  170.     glGenVertexArrays(1, &VAO);
  171.  
  172.     glBindVertexArray(VAO);
  173.  
  174.     glBindBuffer(GL_ARRAY_BUFFER, VBO); /*
  175.     Binds the target buffer to the given address*/
  176.  
  177.     glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); /*
  178.     Copies the vertex data into the buffer object*/
  179.  
  180.  
  181.  
  182.  
  183.     //
  184.     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
  185.  
  186.     glEnableVertexAttribArray(0);
  187.  
  188.  
  189.     // WIREFRAME MODE
  190.     glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  191.  
  192.  
  193.     // Rendering loop
  194.     while (!glfwWindowShouldClose(window))
  195.     {
  196.         // Inputs
  197.         ProcessInput(window);
  198.  
  199.  
  200.         // Rendering loop
  201.         glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
  202.         glClear(GL_COLOR_BUFFER_BIT);
  203.  
  204.  
  205.         // Drawing the triangle
  206.         glUseProgram(shaderProgram);
  207.         /*only one triangle so need to bind vertex array every time*/
  208.         glDrawArrays(GL_TRIANGLES, 0, 3);
  209.  
  210.  
  211.         glfwPollEvents();
  212.         glfwSwapBuffers(window);
  213.     }
  214.  
  215.  
  216.     // DEALLOCATING RESOURCES
  217.     glDeleteVertexArrays(1, &VAO);
  218.     glDeleteBuffers(1, &VBO);
  219.     glDeleteProgram(shaderProgram);
  220.  
  221.  
  222.     glfwTerminate();
  223.  
  224.     return 0;
  225. }
  226.  
  227.  
  228. void ProcessInput(GLFWwindow* window)
  229. {
  230.     if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
  231.     {
  232.         glfwSetWindowShouldClose(window, true);
  233.     }
  234. }
  235.  
  236.  
  237. void FramebufferSizeCallback(GLFWwindow* window, int width, int height)
  238. {
  239.     glViewport(0, 0, width, height);
  240. }
Advertisement
Add Comment
Please, Sign In to add comment