Advertisement
DangerDaisy

Untitled

Apr 24th, 2020
600
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.60 KB | None | 0 0
  1. #include <GL/glew.h>
  2. #include <GLFW/glfw3.h>
  3.  
  4. #include <iostream>
  5. #include <string>
  6. #include <sstream>
  7. #include <fstream>
  8.  
  9. class Renderer {
  10. public:
  11.     bool init();
  12.     bool init_window();
  13.     void init_buffers();
  14.  
  15.     GLFWwindow* get_window();
  16.  
  17.     unsigned int compile_shader_from_file(const std::string&, GLenum);
  18.     unsigned int compile_shader_from_string(const std::string&, GLenum);
  19.     void compile_shader_program();
  20.  
  21.     void draw();
  22.  
  23. private:
  24.     GLFWwindow* window;
  25.     unsigned int vertex_buffer;
  26.     unsigned int shader_program;
  27. };
  28.  
  29. bool Renderer::init() {
  30.     if(init_window()) {
  31.         init_buffers();
  32.         compile_shader_program();
  33.         glUseProgram(shader_program);
  34.         return true;
  35.     }  
  36.     std::cout << "Failed to createGLFW3 window" << std::endl;
  37.     return false;
  38. }
  39.  
  40. bool Renderer::init_window() {
  41.     //Init GLFW
  42.     if (!glfwInit()) {
  43.         std::cout << "Error initializing GLFW3." << std::endl;
  44.         return false;
  45.     }
  46.  
  47.     //Set up the window
  48.     window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
  49.     if (!window)
  50.     {
  51.         glfwTerminate();
  52.         return false;
  53.     }
  54.  
  55.     //Create OpenGL Context;
  56.     glfwMakeContextCurrent(window);
  57.  
  58.     //Init GLEW
  59.     GLenum glew_state = glewInit();
  60.     if(glew_state != GLEW_OK){
  61.         std::cout << "Error initializing GLEW: " << glewGetErrorString(glew_state) << std::endl;
  62.         return false;
  63.     }
  64.     return true;
  65. }
  66.  
  67. void Renderer::init_buffers() {
  68.      //Initialize and set up the vertex buffer
  69.     glGenBuffers(1, &vertex_buffer);
  70.     glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
  71.    
  72.     //Vertex positions (X,Y)
  73.     float verts[6] =  {
  74.         -0.0f, -0.5f,
  75.         -0.5f,  0.5f,
  76.          0.5f,  0.5f
  77.     };
  78.  
  79.     //Buffer vertex data
  80.     glBufferData(GL_ARRAY_BUFFER, 6* sizeof(float), verts, GL_STATIC_DRAW);
  81.  
  82.     //Enable vertex attributes.
  83.     glEnableVertexAttribArray(0);
  84.  
  85.     //Set Vertex attributes
  86.     glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);
  87. }
  88.  
  89. GLFWwindow* Renderer::get_window() {
  90.     return window;
  91. }
  92.  
  93. unsigned int Renderer::compile_shader_from_file(const std::string& file_path, GLenum shader_type) {
  94.     std::ifstream shader_source_file(file_path);
  95.     unsigned int shader = glCreateShader(shader_type);
  96.  
  97.     if(shader_source_file.is_open()) {
  98.         //Read file into string
  99.         std::ostringstream string_buffer;
  100.         string_buffer << shader_source_file.rdbuf();
  101.         std::string shader_source_code = string_buffer.str();
  102.  
  103.         //Create shader and feed it the source code
  104.         unsigned int shader = glCreateShader(shader_type);
  105.         const char* shader_source_code_c = shader_source_code.c_str();
  106.         glShaderSource(shader, 1, &shader_source_code_c , nullptr);
  107.         glCompileShader(shader);
  108.  
  109.         //Check for compile errors.
  110.         int compile_status;
  111.         glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status);
  112.         if(compile_status != GL_TRUE) {
  113.             int length;
  114.             glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);
  115.             char shader_compile_error_message[length];
  116.             glGetShaderInfoLog(shader, length, &length, shader_compile_error_message);
  117.             std::cout << "Renderer::compile_shader() - Error: failed to compile " << (shader_type == GL_VERTEX_SHADER ? "vertex" : "fragment") << "shader: " << shader_compile_error_message << std::endl;
  118.             glDeleteShader(shader);
  119.             return 0;
  120.         }
  121.     }
  122.     shader_source_file.close();
  123.     return shader;
  124. }
  125.  
  126. unsigned int Renderer::compile_shader_from_string(const std::string& shader_source_code, GLenum shader_type) {
  127.     std::cout << "Compiling " <<  (shader_type == GL_VERTEX_SHADER ? "vertex " : "fragment ") << "shader from string..." << std::endl;
  128.     unsigned int shader = glCreateShader(shader_type);
  129.     const char* shader_source_code_c = shader_source_code.c_str();
  130.     glShaderSource(shader, 1, &shader_source_code_c , nullptr);
  131.     glCompileShader(shader);
  132.  
  133.     int compile_status;
  134.     glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status);
  135.     if(compile_status != GL_TRUE) {
  136.         int length;
  137.         glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);
  138.         char shader_compile_error_message[length];
  139.         glGetShaderInfoLog(shader, length, &length, shader_compile_error_message);
  140.         std::cout << "Renderer::compile_shader() - Error: failed to compile " << (shader_type == GL_VERTEX_SHADER ? "vertex" : "fragment") << "shader: " << shader_compile_error_message << std::endl;
  141.         glDeleteShader(shader);
  142.         return 0;
  143.     }
  144.     std::cout  << (shader_type == GL_VERTEX_SHADER ? "Vertex " : "Fragment ") << "shader successfully compiled from string." << std::endl;
  145.     return shader;
  146. }
  147.  
  148. void Renderer::compile_shader_program() {
  149.     shader_program = glCreateProgram();
  150.  
  151.     std::string vertex_shader_source =
  152.         "#version 300 es\n"
  153.         "layout(location = 0) in vec4 verts;\n"
  154.         "void main(){\n"
  155.         "    gl_Position = verts;\n"
  156.         "}\n";
  157.  
  158.     std::string fragment_shader_source =
  159.         "#version 300 es\n"
  160.         "precision mediump float;"
  161.         "out vec3 color;\n"
  162.         "void main() {\n"
  163.         "    color = vec3(1,0,0);\n"
  164.         "}\n";
  165.  
  166.     unsigned int vertex_shader = compile_shader_from_file("shaders/300_es.vert", GL_VERTEX_SHADER);
  167.     unsigned int frgmnt_shader = compile_shader_from_file("shaders/300_es.frag", GL_FRAGMENT_SHADER);
  168.  
  169.     //Attach shaders to program
  170.     glAttachShader(shader_program, vertex_shader);
  171.     glAttachShader(shader_program, frgmnt_shader);
  172.    
  173.     glLinkProgram(shader_program);
  174.     glValidateProgram(shader_program);
  175.  
  176.     //Error checking
  177.     int program_validate_successful;
  178.     glGetProgramiv(shader_program, GL_VALIDATE_STATUS, &program_compile_successful);
  179.     if(program_validate_successful != GL_TRUE) {
  180.         int length;
  181.         glGetProgramiv(shader_program, GL_INFO_LOG_LENGTH, &length);
  182.         char message[length];
  183.         glGetProgramInfoLog(shader_program, length, &length, message);
  184.         std::cout << "Error compiling shader program: " << message << std::endl;
  185.     }
  186.  
  187.     //Cleanup
  188.     glDeleteShader(vertex_shader);
  189.     glDeleteShader(frgmnt_shader);
  190. }
  191.  
  192. void Renderer::draw() {
  193.     glClear(GL_COLOR_BUFFER_BIT);
  194.     glDrawArrays(GL_TRIANGLES, 0, 3);
  195.     glfwSwapBuffers(window);
  196. }
  197.  
  198. int main() {
  199.     Renderer r;
  200.  
  201.     if (!r.init()) {
  202.         return -1;
  203.     }
  204.  
  205.     /* Loop until the user closes the window */
  206.     while (!glfwWindowShouldClose(r.get_window())) {        
  207.         r.draw();
  208.         glfwPollEvents();
  209.     }
  210.  
  211.     glfwTerminate();
  212.     return 0;
  213. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement