Advertisement
Guest User

Untitled

a guest
Jul 5th, 2023
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.32 KB | None | 0 0
  1.  
  2. #include <glad/glad.h>
  3. #include <GLFW/glfw3.h>
  4. #include <glm/glm.hpp>
  5. #include <glm/gtc/matrix_transform.hpp>
  6. #include <glm/gtc/type_ptr.hpp>
  7. #define STB_IMAGE_IMPLEMENTATION
  8. #include "stb_image.h"
  9.  
  10. #include <assert.h>
  11. #include <iostream>
  12. #include <vector>
  13. //#include <filesystem>
  14.  
  15. #include "ShaderHelpers.h"
  16. #include "MeshClasses.h"
  17.  
  18. void framebuffer_size_callback(GLFWwindow* window, int width, int height) {
  19.     glViewport(0, 0, width, height);
  20. }
  21.  
  22. void processInput(GLFWwindow *window) {
  23.     if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
  24.         glfwSetWindowShouldClose(window, true);
  25. }
  26.  
  27. bool initTexture(const std::string& path, GLuint* texture)
  28. {
  29.     //GLuint texture;
  30.     glGenTextures(1, texture);
  31.  
  32.     glBindTexture(GL_TEXTURE_2D, *texture);
  33.  
  34.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  35.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  36.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  37.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  38.  
  39.     int width, height, nrChannels;
  40.     unsigned char *data = stbi_load(path.c_str(), &width, &height, &nrChannels, 0);
  41.  
  42.     if (nrChannels != 3 && nrChannels != 4)
  43.     {
  44.         std::cout << "Unknown texture format" << std::endl;
  45.         return false;
  46.     }
  47.  
  48.     if (data)
  49.     {
  50.         assert(nrChannels == 3 || nrChannels == 4);
  51.         unsigned int img_fmt = nrChannels == 3 ? GL_RGB : GL_RGBA;   // this is not quite right...
  52.         glTexImage2D(GL_TEXTURE_2D, 0, img_fmt, width, height, 0, img_fmt, GL_UNSIGNED_BYTE, data);
  53.         glGenerateMipmap(GL_TEXTURE_2D);
  54.     }
  55.     else
  56.     {
  57.         std::cout << "Failed to load texture" << std::endl;
  58.         return false;
  59.     }
  60.     stbi_image_free(data);
  61.     return true;
  62. }
  63.  
  64. const std::string SHADERS_ROOT = "..\\Shaders";
  65. const std::string TEXTURES_ROOT = "..\\Textures";
  66.  
  67. int main() {    
  68.     //std::cout << std::experimental::filesystem::current_path() << std::endl;
  69.  
  70.     glfwInit();
  71.     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
  72.     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
  73.     glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  74.  
  75.     GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
  76.     if (window == NULL)
  77.     {
  78.         std::cout << "Failed to create GLFW window" << std::endl;
  79.         glfwTerminate();
  80.         return -1;
  81.     }
  82.     glfwMakeContextCurrent(window);
  83.  
  84.     if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
  85.     {
  86.         std::cout << "Failed to initialize GLAD" << std::endl;
  87.         return -1;
  88.     }
  89.  
  90.     //
  91.  
  92.     ShaderProgram uniformShaderProgram(SHADERS_ROOT + "\\basicVertexShader.vert", SHADERS_ROOT + "\\uniformColorShader.frag");
  93.     ShaderProgram myShaderProgram(SHADERS_ROOT + "\\basicVertexShader.vert", SHADERS_ROOT + "\\basicFragmentShader.frag");
  94.     ShaderProgram colorShaderProgram(SHADERS_ROOT + "\\vertexColorShader.vert", SHADERS_ROOT + "\\customColorShader.frag");
  95.     ShaderProgram textureShaderProgram(SHADERS_ROOT + "\\textureShader.vert", SHADERS_ROOT + "\\textureShader.frag");
  96.     ShaderProgram transformShaderProgram(SHADERS_ROOT + "\\transformShader.vert", SHADERS_ROOT + "\\textureShader.frag");
  97.  
  98.     //
  99.  
  100.     float triVertices[] = {
  101.         // positions         // colors
  102.          0.5f, -0.5f, 0.0f,  1.0f, 0.0f, 0.0f,   // bottom right
  103.         -0.5f, -0.5f, 0.0f,  0.0f, 1.0f, 0.0f,   // bottom left
  104.          0.0f,  0.5f, 0.0f,  0.0f, 0.0f, 1.0f    // top
  105.     };
  106.  
  107.     float quadVertices[] = {
  108.         // positions          // colors           // texture coords
  109.          0.5f,  0.5f, 0.0f,   1.0f, 0.0f, 0.0f,   1.0f, 1.0f,   // top right
  110.          0.5f, -0.5f, 0.0f,   0.0f, 1.0f, 0.0f,   1.0f, 0.0f,   // bottom right
  111.         -0.5f, -0.5f, 0.0f,   0.0f, 0.0f, 1.0f,   0.0f, 0.0f,   // bottom left
  112.         -0.5f,  0.5f, 0.0f,   1.0f, 1.0f, 0.0f,   0.0f, 1.0f    // top left
  113.     };
  114.  
  115.     unsigned int quadIndices[] = {  
  116.         0, 1, 3,   // first triangle
  117.         1, 2, 3    // second triangle
  118.     };
  119.  
  120.     std::vector<float> quadVtx = {
  121.         // positions          // colors           // texture coords
  122.          0.5f,  0.5f, 0.0f,   1.0f, 0.0f, 0.0f,   1.0f, 1.0f,   // top right
  123.          0.5f, -0.5f, 0.0f,   0.0f, 1.0f, 0.0f,   1.0f, 0.0f,   // bottom right
  124.         -0.5f, -0.5f, 0.0f,   0.0f, 0.0f, 1.0f,   0.0f, 0.0f,   // bottom left
  125.         -0.5f,  0.5f, 0.0f,   1.0f, 1.0f, 0.0f,   0.0f, 1.0f    // top left
  126.     };
  127.  
  128.     std::vector<unsigned int> quadIdx = {
  129.         0, 1, 3,   // first triangle
  130.         1, 2, 3    // second triangle
  131.     };
  132.    
  133.     //
  134.     BaseMesh mesh(quadVtx, { 3,3,2 }, quadIdx);
  135.  
  136.     unsigned int VAO;
  137.     glGenVertexArrays(1, &VAO);
  138.    
  139.     unsigned int VBO;
  140.     glGenBuffers(1, &VBO);
  141.  
  142.     unsigned int EBO;
  143.     glGenBuffers(1, &EBO);
  144.  
  145.     glBindVertexArray(VAO);
  146.  
  147.     glBindBuffer(GL_ARRAY_BUFFER, VBO);
  148.     //glBufferData(GL_ARRAY_BUFFER, sizeof(triVertices), triVertices, GL_STATIC_DRAW);
  149.     glBufferData(GL_ARRAY_BUFFER, sizeof(quadVertices), quadVertices, GL_STATIC_DRAW);
  150.  
  151.     // position attribute
  152.     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
  153.     glEnableVertexAttribArray(0);
  154.     //// color attribute
  155.     glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));
  156.     glEnableVertexAttribArray(1);
  157.  
  158.     glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));
  159.     glEnableVertexAttribArray(2);
  160.  
  161.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
  162.     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(quadIndices), quadIndices, GL_STATIC_DRAW);
  163.  
  164.     glBindBuffer(GL_ARRAY_BUFFER, 0);
  165.     glBindVertexArray(0);
  166.  
  167.     //
  168.  
  169.     stbi_set_flip_vertically_on_load(true);
  170.  
  171.     bool res;
  172.     unsigned int texture1, texture2;
  173.     res = initTexture(TEXTURES_ROOT + "\\wall.jpg", &texture1);
  174.     if (!res)
  175.         return -1;
  176.  
  177.     res = initTexture(TEXTURES_ROOT + "\\awesomeface.png", &texture2);
  178.     if (!res)
  179.         return -1;
  180.  
  181.     //
  182.  
  183.     //glUseProgram(uniformShaderProgram.getID());
  184.     //glUseProgram(myShaderProgram.getID());
  185.     //glUseProgram(colorShaderProgram.getID());
  186.     //glUseProgram(textureShaderProgram.getID());
  187.     glUseProgram(transformShaderProgram.getID());
  188.  
  189.     //glBindVertexArray(VAO);
  190.     glBindVertexArray(mesh.GetVAO());
  191.     //glBindTexture(GL_TEXTURE_2D, texture1);
  192.  
  193.     glActiveTexture(GL_TEXTURE0);
  194.     glBindTexture(GL_TEXTURE_2D, texture1);
  195.     glActiveTexture(GL_TEXTURE1);
  196.     glBindTexture(GL_TEXTURE_2D, texture2);
  197.  
  198.     glUniform1i(glGetUniformLocation(transformShaderProgram.getID(), "ourTexture"), 0);
  199.     glUniform1i(glGetUniformLocation(transformShaderProgram.getID(), "ourTexture2"), 1);
  200.  
  201.     //
  202.  
  203.     glViewport(0, 0, 800, 600);
  204.  
  205.     glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
  206.  
  207.     /*GLuint shaders[3] = { uniformShaderProgram.getID() , myShaderProgram.getID() , colorShaderProgram.getID() };
  208.     int frameTimer = 0;
  209.     int curShader = 0;*/
  210.  
  211.     glm::mat4 trans = glm::mat4(1.0f);    
  212.     //trans = glm::mat4({ -1.f, 0.f, 0.f, 0.f, 0.f, -1.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 0.f, 1.f });
  213.     trans = glm::translate(trans, { 0.2, 0.2, 0.0 });
  214.     trans = glm::rotate(trans, glm::radians(90.0f), glm::vec3(0.0, 0.0, 1.0));
  215.     trans = glm::scale(trans, glm::vec3(0.5, 0.5, 0.5));
  216.     unsigned int transformLoc = glGetUniformLocation(transformShaderProgram.getID(), "transform");
  217.     glUniformMatrix4fv(glGetUniformLocation(transformShaderProgram.getID(), "transform"), 1, GL_FALSE, glm::value_ptr(trans));
  218.    
  219.     while (!glfwWindowShouldClose(window))
  220.     {
  221.         processInput(window);
  222.  
  223.         glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
  224.         glClear(GL_COLOR_BUFFER_BIT);
  225.        
  226.         float timeValue = glfwGetTime();
  227.         float greenValue = sin(timeValue) / 2.0f + 0.5f;
  228.         int vertexColorLocation = glGetUniformLocation(uniformShaderProgram.getID(), "ourColor");
  229.         //glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f);
  230.  
  231.         //glDrawArrays(GL_TRIANGLES, 0, 3);
  232.         glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
  233.  
  234.         glfwSwapBuffers(window);
  235.         glfwPollEvents();
  236.     }
  237.  
  238.     glDeleteVertexArrays(1, &VAO);
  239.     glDeleteBuffers(1, &VBO);
  240.     glDeleteBuffers(1, &EBO);
  241.  
  242.     glfwTerminate();
  243.  
  244.     return 0;
  245. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement