penrose

program for generating penrose tilings.
Log | Files | Refs | README | LICENSE

shader.cpp (3234B)


      1 /*
      2  * © 2020 Michael Percival <m@michaelpercival.xyz>
      3  *   See LICENSE file for copyright and license details.
      4  */
      5 
      6 #include <fstream>
      7 #include <iostream>
      8 #include <sstream>
      9 #include <vector>
     10 
     11 #include "shader.hpp"
     12 
     13 GLuint Shader::loadShaders(std::string vert_shader, std::string frag_shader) {
     14     // Create the shaders
     15     GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER);
     16     GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
     17 
     18     // Read the Vertex Shader code from the file
     19     std::string VertexShaderCode;
     20     std::ifstream VertexShaderStream(vert_shader, std::ios::in);
     21     if (VertexShaderStream.is_open()) {
     22         std::stringstream sstr;
     23         sstr << VertexShaderStream.rdbuf();
     24         VertexShaderCode = sstr.str();
     25         VertexShaderStream.close();
     26     }
     27 
     28     // Read the Fragment Shader code from the file
     29     std::string FragmentShaderCode;
     30     std::ifstream FragmentShaderStream(frag_shader, std::ios::in);
     31     if (FragmentShaderStream.is_open()) {
     32         std::stringstream sstr;
     33         sstr << FragmentShaderStream.rdbuf();
     34         FragmentShaderCode = sstr.str();
     35         FragmentShaderStream.close();
     36     }
     37 
     38     GLint Result = GL_FALSE;
     39     int InfoLogLength;
     40 
     41     // Compile Vertex Shader
     42     char const * VertexSourcePointer = VertexShaderCode.c_str();
     43     glShaderSource(VertexShaderID, 1, &VertexSourcePointer , NULL);
     44     glCompileShader(VertexShaderID);
     45 
     46     // Check Vertex Shader
     47     glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result);
     48     glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
     49     if (!InfoLogLength) {
     50         std::vector<char> VertexShaderErrorMessage(InfoLogLength + 1);
     51         glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]);
     52         printf("%sn", &VertexShaderErrorMessage[0]);
     53     }
     54 
     55     // Compile Fragment Shader
     56     char const * FragmentSourcePointer = FragmentShaderCode.c_str();
     57     glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer , NULL);
     58     glCompileShader(FragmentShaderID);
     59 
     60     // Check Fragment Shader
     61     glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result);
     62     glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
     63     if (!InfoLogLength) {
     64         std::vector<char> FragmentShaderErrorMessage(InfoLogLength + 1);
     65         glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]);
     66         printf("%sn", &FragmentShaderErrorMessage[0]);
     67     }
     68 
     69     // Link the program
     70     GLuint ProgramID = glCreateProgram();
     71     glAttachShader(ProgramID, VertexShaderID);
     72     glAttachShader(ProgramID, FragmentShaderID);
     73     glLinkProgram(ProgramID);
     74 
     75     // Check the program
     76     glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result);
     77     glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength);
     78     if (!InfoLogLength) {
     79         std::vector<char> ProgramErrorMessage(InfoLogLength + 1);
     80         glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]);
     81         printf("%sn", &ProgramErrorMessage[0]);
     82     }
     83 
     84     glDetachShader(ProgramID, VertexShaderID);
     85     glDetachShader(ProgramID, FragmentShaderID);
     86     glDeleteShader(VertexShaderID);
     87     glDeleteShader(FragmentShaderID);
     88 
     89     return ProgramID;
     90 }