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 }