Advertisement
rzvm

title

Oct 18th, 2021
868
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.37 KB | None | 0 0
  1. //
  2. //  main.cpp
  3. //  OpenGL_Shader_Example_step1
  4. //
  5. //  Created by CGIS on 30/11/15.
  6. //  Copyright © 2015 CGIS. All rights reserved.
  7. //
  8.  
  9. #define GLEW_STATIC
  10.  
  11. #include <iostream>
  12. #include <fstream>
  13. #include <sstream>
  14. #include <string>
  15.  
  16. #include <GL/glew.h>
  17. #include <GLFW/glfw3.h>
  18.  
  19. int glWindowWidth = 640;
  20. int glWindowHeight = 480;
  21. int retina_width, retina_height;
  22. GLFWwindow* glWindow = NULL;
  23.  
  24. GLuint shaderProgram;
  25. GLuint shaderProgram2;
  26.  
  27. GLfloat vertexCoordinates[] = {
  28.     -0.5f, 0.5f, 0.0f,
  29.     -0.5f, -0.5f, 0.0f,
  30.     0.5f, 0.5f, 0.0f
  31. };
  32.  
  33. GLfloat vertexCoordinatesForSecondTriangle[] = {
  34.     0.5f, 0.5f, 0.0f,
  35.     0.5f, -0.5f, 0.0f,
  36.     -0.5f, -0.5f, 0.0f
  37. };
  38.  
  39. GLuint verticesVBO;
  40. GLuint triangleVAO;
  41. GLuint verticesVBO2;
  42. GLuint triangleVAO2;
  43.  
  44. void windowResizeCallback(GLFWwindow* window, int width, int height)
  45. {
  46.     fprintf(stdout, "window resized to width: %d , and height: %d\n", width, height);
  47.     //TODO
  48. }
  49.  
  50. void initObjects()
  51. {
  52.     //genereaza un ID unic pentru verticesVBO
  53.     glGenBuffers(1, &verticesVBO);
  54.     //asociaza buffer-ul verticesVBO variabilei OpenGL GL_ARRAY_BUFFER,
  55.     //orice referire ulterioara la GL_ARRAY_BUFFER va configura buffer-ul asociat momentan,
  56.     //care este verticesVBO
  57.     glBindBuffer(GL_ARRAY_BUFFER, verticesVBO);
  58.     //copiaza datele in buffer-ul current asociat – specificat prin intermediul primului argument
  59.     //tipul buffer-ului – al doilea argument specifica dimensiunea (in Bytes) datelor
  60.     //al treilea argument reprezinta datele pe care vrem sa le trimitem
  61.     //al patrulea argument specifica modul in care vor fi tratate datele de catre placa video
  62.     glBufferData(GL_ARRAY_BUFFER, sizeof(vertexCoordinates), vertexCoordinates, GL_STATIC_DRAW);
  63.  
  64.     //genereaza un ID unic, care corespunde obiectului triangleVAO
  65.     glGenVertexArrays(1, &triangleVAO);
  66.     glBindVertexArray(triangleVAO);
  67.     glBindBuffer(GL_ARRAY_BUFFER, verticesVBO);
  68.     //seteaza pointer-ul atributelor de varf
  69.     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
  70.     glEnableVertexAttribArray(0);
  71.     //de-selecteaza obiectul triangleVAO
  72.     glBindVertexArray(0);
  73.  
  74.  
  75.  
  76.     glGenBuffers(1, &verticesVBO2);
  77.     glBindBuffer(GL_ARRAY_BUFFER, verticesVBO2);
  78.     glBufferData(GL_ARRAY_BUFFER, sizeof(vertexCoordinatesForSecondTriangle), vertexCoordinatesForSecondTriangle, GL_STATIC_DRAW);
  79.  
  80.     glGenVertexArrays(1, &triangleVAO2);
  81.     glBindVertexArray(triangleVAO2);
  82.     glBindBuffer(GL_ARRAY_BUFFER, verticesVBO2);
  83.     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
  84.     glEnableVertexAttribArray(0);
  85.     glBindVertexArray(0);
  86. }
  87.  
  88. bool initOpenGLWindow()
  89. {
  90.     if (!glfwInit()) {
  91.         fprintf(stderr, "ERROR: could not start GLFW3\n");
  92.         return false;
  93.     }
  94.  
  95.     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
  96.     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
  97.     glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
  98.     glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  99.  
  100.     // for multisampling/antialising
  101.     glfwWindowHint(GLFW_SAMPLES, 4);
  102.  
  103.     glWindow = glfwCreateWindow(glWindowWidth, glWindowHeight, "OpenGL Shader Example", NULL, NULL);
  104.     if (!glWindow) {
  105.         fprintf(stderr, "ERROR: could not open window with GLFW3\n");
  106.         glfwTerminate();
  107.         return false;
  108.     }
  109.  
  110.     glfwSetWindowSizeCallback(glWindow, windowResizeCallback);
  111.     glfwMakeContextCurrent(glWindow);
  112.  
  113.     // start GLEW extension handler
  114.     glewExperimental = GL_TRUE;
  115.     glewInit();
  116.  
  117.     // get version info
  118.     const GLubyte* renderer = glGetString(GL_RENDERER); // get renderer string
  119.     const GLubyte* version = glGetString(GL_VERSION); // version as a string
  120.     printf("Renderer: %s\n", renderer);
  121.     printf("OpenGL version supported %s\n", version);
  122.  
  123.     //for RETINA display
  124.     glfwGetFramebufferSize(glWindow, &retina_width, &retina_height);
  125.  
  126.     return true;
  127. }
  128.  
  129. void renderScene()
  130. {
  131.     //initializeaza buffer-ele de culoare si adancime inainte de a rasteriza cadrul curent
  132.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  133.     //defineste culoarea de fundal
  134.     glClearColor(0.8, 0.8, 0.8, 1.0);
  135.     //specifica locatia si dimensiunea ferestrei
  136.     glViewport(0, 0, retina_width, retina_height);
  137.  
  138.     //proceseaza evenimentele de la tastatura
  139.     if (glfwGetKey(glWindow, GLFW_KEY_A)) {
  140.         //TODO
  141.     }
  142.  
  143.     if (glfwGetKey(glWindow, GLFW_KEY_D)) {
  144.         //TODO
  145.     }
  146.  
  147.     //activeaza program shader-ul; apeluri ulterioare de rasterizare vor utiliza acest program
  148.     glUseProgram(shaderProgram);
  149.  
  150.     //activeaza VAO
  151.     glBindVertexArray(triangleVAO);
  152.     //specifica tipul primitiei, indicele de inceput si numarul de indici utilizati pentru rasterizare
  153.     glDrawArrays(GL_TRIANGLES, 0, 3);
  154.  
  155.  
  156.    
  157.     glUseProgram(shaderProgram2);
  158.  
  159.     glBindVertexArray(triangleVAO2);
  160.     glDrawArrays(GL_TRIANGLES, 0, 3);
  161.  
  162. }
  163.  
  164. std::string readShaderFile(std::string fileName)
  165. {
  166.     std::ifstream shaderFile;
  167.     std::string shaderString;
  168.  
  169.     //open shader file
  170.     shaderFile.open(fileName);
  171.  
  172.     std::stringstream shaderStringStream;
  173.  
  174.     //read shader content into stream
  175.     shaderStringStream << shaderFile.rdbuf();
  176.  
  177.     //close shader file
  178.     shaderFile.close();
  179.  
  180.     //convert stream into GLchar array
  181.     shaderString = shaderStringStream.str();
  182.     return shaderString;
  183. }
  184.  
  185. void shaderCompileLog(GLuint shaderId)
  186. {
  187.     GLint success;
  188.     GLchar infoLog[512];
  189.  
  190.     //check compilation info
  191.     glGetShaderiv(shaderId, GL_COMPILE_STATUS, &success);
  192.     if (!success)
  193.     {
  194.         glGetShaderInfoLog(shaderId, 512, NULL, infoLog);
  195.         std::cout << "Shader compilation error\n" << infoLog << std::endl;
  196.     }
  197. }
  198.  
  199. void shaderLinkLog(GLuint shaderProgramId)
  200. {
  201.     GLint success;
  202.     GLchar infoLog[512];
  203.  
  204.     //check linking info
  205.     glGetProgramiv(shaderProgramId, GL_LINK_STATUS, &success);
  206.     if (!success) {
  207.         glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
  208.         std::cout << "Shader linking error\n" << infoLog << std::endl;
  209.     }
  210. }
  211.  
  212. GLuint initBasicShader(std::string vertexShaderFileName, std::string fragmentShaderFileName)
  213. {
  214.     GLuint shaderProgram;
  215.  
  216.     //read, parse and compile the vertex shader
  217.     std::string v = readShaderFile(vertexShaderFileName);
  218.     const GLchar* vertexShaderString = v.c_str();
  219.     GLuint vertexShader;
  220.     vertexShader = glCreateShader(GL_VERTEX_SHADER);
  221.     glShaderSource(vertexShader, 1, &vertexShaderString, NULL);
  222.     glCompileShader(vertexShader);
  223.     //check compilation status
  224.     shaderCompileLog(vertexShader);
  225.  
  226.     //read, parse and compile the fragment shader
  227.     std::string f = readShaderFile(fragmentShaderFileName);
  228.     const GLchar* fragmentShaderString = f.c_str();
  229.     GLuint fragmentShader;
  230.     fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  231.     glShaderSource(fragmentShader, 1, &fragmentShaderString, NULL);
  232.     glCompileShader(fragmentShader);
  233.     //check compilation status
  234.     shaderCompileLog(fragmentShader);
  235.  
  236.     //attach and link the shader programs
  237.     shaderProgram = glCreateProgram();
  238.     glAttachShader(shaderProgram, vertexShader);
  239.     glAttachShader(shaderProgram, fragmentShader);
  240.     glLinkProgram(shaderProgram);
  241.     glDeleteShader(vertexShader);
  242.     glDeleteShader(fragmentShader);
  243.     //check linking info
  244.     shaderLinkLog(shaderProgram);
  245.  
  246.     return shaderProgram;
  247. }
  248.  
  249. void cleanup() {
  250.     glfwDestroyWindow(glWindow);
  251.     //close GL context and any other GLFW resources
  252.     glfwTerminate();
  253. }
  254.  
  255. int main(int argc, const char* argv[]) {
  256.  
  257.     if (!initOpenGLWindow()) {
  258.         glfwTerminate();
  259.         return 1;
  260.     }
  261.  
  262.     initObjects();
  263.  
  264.     shaderProgram = initBasicShader("shader.vert", "shader.frag");
  265.     shaderProgram2 = initBasicShader("shader.vert", "shader2.frag");
  266.  
  267.     while (!glfwWindowShouldClose(glWindow)) {
  268.         renderScene();
  269.  
  270.         glfwPollEvents();
  271.         glfwSwapBuffers(glWindow);
  272.     }
  273.  
  274.     cleanup();
  275.  
  276.     return 0;
  277. }
  278.  
  279.  
  280.  
  281.  
  282.  
  283. /*
  284. #define GLEW_STATIC
  285.  
  286. #include <iostream>
  287. #include <GL/glew.h>
  288. #include <GLFW/glfw3.h>
  289.  
  290. int glWindowWidth = 640;
  291. int glWindowHeight = 480;
  292.  
  293. GLFWwindow* glWindow = NULL;
  294.  
  295. bool initOpenGLWindow()
  296. {
  297.     if (!glfwInit()) {
  298.         fprintf(stderr, "ERROR: could not start GLFW3\n");
  299.         return false;
  300.     }
  301.  
  302.     glWindow = glfwCreateWindow(glWindowWidth, glWindowHeight, "Hello Window", NULL, NULL);
  303.     if (!glWindow) {
  304.         fprintf(stderr, "ERROR: could not open window with GLFW3\n");
  305.         glfwTerminate();
  306.         return false;
  307.     }
  308.  
  309.     glfwMakeContextCurrent(glWindow);
  310.  
  311.     // start GLEW extension handler
  312.     glewExperimental = GL_TRUE;
  313.     glewInit();
  314.  
  315.     // get version info
  316.     const GLubyte* renderer = glGetString(GL_RENDERER); // get renderer string
  317.     const GLubyte* version = glGetString(GL_VERSION); // version as a string
  318.     printf("Renderer: %s\n", renderer);
  319.     printf("OpenGL version supported %s\n", version);
  320.  
  321.     return true;
  322. }
  323.  
  324. void processEvents() {
  325.     if (glfwGetKey(glWindow, GLFW_KEY_A)) {
  326.         //TODO
  327.         std::cout << "PRESSED KEY A" << "\n";
  328.     }
  329. }
  330.  
  331. void renderScene() {
  332.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  333.     glClearColor(0, 0, 1, 1.0);
  334. }
  335.  
  336. int main(int argc, const char* argv[]) {
  337.  
  338.     initOpenGLWindow();
  339.  
  340.     while (!glfwWindowShouldClose(glWindow)) {
  341.  
  342.         renderScene();
  343.         processEvents();
  344.  
  345.         glfwPollEvents();
  346.         glfwSwapBuffers(glWindow);
  347.     }
  348.     //close GL context and any other GLFW resources
  349.     glfwTerminate();
  350.  
  351.     return 0;
  352. }*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement