Code:
class ShaderProgram{
public:
ShaderProgram(){
}
ShaderProgram(const char *vsPath, const char *fsPath){
int32_t compileStat, linkStat;
uint32_t vertexS = glCreateShader(GL_VERTEX_SHADER);
uint32_t fragS = glCreateShader(GL_FRAGMENT_SHADER);
string vsSource = LoadFile(vsPath);
string fsSource = LoadFile(fsPath);
const char *source = vsSource.c_str();
glShaderSource(vertexS, 1, &source, NULL);
source = fsSource.c_str();
glShaderSource(fragS, 1, &source, NULL);
glCompileShader(vertexS);
glGetShaderiv(vertexS, GL_COMPILE_STATUS, &compileStat);
if(compileStat == 0){
char BUFFER[256];
glGetShaderInfoLog(vertexS, sizeof(BUFFER), NULL, BUFFER);
cerr << "-!- Error compiling vertex shader: " << BUFFER << endl;
good = false;
return;
}
glCompileShader(fragS);
glGetShaderiv(fragS, GL_COMPILE_STATUS, &compileStat);
if(compileStat == 0){
char BUFFER[256];
glGetShaderInfoLog(fragS, sizeof(BUFFER), NULL, BUFFER);
cerr << "-!- Error compiling fragment shader: " << BUFFER << endl;
good = false;
return;
}
program = glCreateProgram();
glAttachShader(program, vertexS);
glAttachShader(program, fragS);
glLinkProgram(program);
glGetProgramiv(program, GL_LINK_STATUS, &linkStat);
if(!linkStat){
cerr << "-!- Error linking program." << endl;
good = false;
return;
}
good = true;
}
void getUniform(uint32_t &location, const char *uniformName){
location = glGetUniformLocation(program, uniformName);
assert(location != 0xFFFFFFFF);
}
void bind(){
glUseProgram(program);
}
void unbind(){
glUseProgram(0);
}
~ShaderProgram(){
glDeleteProgram(program);
glUseProgram(0);
}
bool good;
uint32_t program;
};