← index
OpenGL.Examples/GLFW/008.Cube/gl_shader.cpp
Source: OpenGL.Examples/GLFW/008.Cube/gl_shader.cpp
#include"gl_shader.hpp"
#include<sstream>
#include<fstream>

int ShaderProgram::printShaderLog(GLuint shader) {
    int len = 0;
    int ch = 0;
    char *log;
    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len);
    if(len > 0) {
        log = new char [len+1];
        glGetShaderInfoLog(shader, len, &ch, log);
        std::cout << "Shader: " << log << "\n";
        delete [] log;
    }
    return 0;
}
void ShaderProgram::printProgramLog(int p) {
    int len = 0;
    int ch = 0;
    char *log;
    glGetShaderiv(p, GL_INFO_LOG_LENGTH, &len);
    if(len > 0) {
        log = new char [len+1];
        glGetProgramInfoLog(p, len, &ch, log);
        std::cout << "Program: " << log << "\n";
        delete [] log;
    }
}
bool ShaderProgram::checkError() {
    bool e = false;
    int glErr = glGetError();
    while(glErr != GL_NO_ERROR) {
        std::cout << "GL Error: " << glErr << "\n";
        e = true;
        glErr = glGetError();
    }
    return e;
}

GLuint ShaderProgram::createProgram(const char *vshaderSource, const char *fshaderSource) {
    GLint vertCompiled;
    GLint fragCompiled;
    GLint linked;
    GLuint vShader = glCreateShader(GL_VERTEX_SHADER);
    GLuint fShader = glCreateShader(GL_FRAGMENT_SHADER);
    
    glShaderSource(vShader, 1, &vshaderSource, NULL);
    glShaderSource(fShader, 1, &fshaderSource, NULL);
    
    glCompileShader(vShader);
    checkError();
    glGetShaderiv(vShader, GL_COMPILE_STATUS, &vertCompiled);
    
    if(vertCompiled != 1) {
        std::cout << "Error on Vertex compile\n";
        printShaderLog(vShader);
    }
    
    glCompileShader(fShader);
    checkError();
    
    glGetShaderiv(fShader, GL_COMPILE_STATUS, &fragCompiled);
    
    if(fragCompiled != 1) {
        std::cout << "Error on Fragment compile\n";
        printShaderLog(vShader);
    }
    GLuint vfProgram = glCreateProgram();
    glAttachShader(vfProgram, vShader);
    glAttachShader(vfProgram, fShader);
    glLinkProgram(vfProgram);
    checkError();
    glGetProgramiv(vfProgram, GL_LINK_STATUS, &linked);
    if(linked != 1) {
        std::cout << "Linking failed...\n";
        printProgramLog(vfProgram);
    }
    return vfProgram;
}

GLuint ShaderProgram::createProgramFromFile(const std::string &vert, const std::string &frag) {
    std::fstream v,f;
    v.open(vert, std::ios::in);
    if(!v.is_open()) {
        std::cerr << "Error could not open file: " << vert << "\n";
        exit(EXIT_FAILURE);
    }
    f.open(frag, std::ios::in);
    if(!f.is_open()) {
        std::cerr << "Eror could not open file: " << frag << "\n";
        exit(EXIT_FAILURE);
    }
    std::ostringstream stream1, stream2;
    stream1 << v.rdbuf();
    stream2 << f.rdbuf();
    return createProgram(stream1.str().c_str(), stream2.str().c_str());
}