diff --git a/include/InitShader.h b/include/InitShader.h index 83cf92c..63d131a 100644 --- a/include/InitShader.h +++ b/include/InitShader.h @@ -7,6 +7,7 @@ GLuint InitShader( const char* computeShaderFile); GLuint InitShader( const char* vertexShaderFile, const char* fragmentShaderFile ); GLuint InitShader( const char* vertexShaderFile, const char* geometryShader, const char* fragmentShaderFile ); GLuint InitShader( const char* vShaderFile, const char* tcShader, const char* teShader, const char* fShaderFile ); +GLuint InitShader( const char* vShaderFile, const char* tcShader, const char* teShader, const char* gShaderFile, const char* fShaderFile ); #endif \ No newline at end of file diff --git a/source/InitShader.cpp b/source/InitShader.cpp index 9194613..57c20c1 100644 --- a/source/InitShader.cpp +++ b/source/InitShader.cpp @@ -336,5 +336,75 @@ GLuint InitShader( const char* vShaderFile, const char* tcShader, const char* te /* use program object */ glUseProgram(program); + return program; +} + +GLuint InitShader( const char* vShaderFile, const char* tcShader, const char* teShader, const char* gShaderFile, const char* fShaderFile ) +{ + bool error = false; + struct Shader + { + const char* filename; + GLenum type; + std::string source; + } shaders[5] = + { + { vShaderFile, GL_VERTEX_SHADER, "" }, + { tcShader, GL_TESS_CONTROL_SHADER, "" }, + { teShader, GL_TESS_EVALUATION_SHADER, "" }, + { gShaderFile, GL_GEOMETRY_SHADER, "" }, + { fShaderFile, GL_FRAGMENT_SHADER, "" } + }; + + GLuint program = glCreateProgram(); + + for ( int i = 0; i < 5; ++i ) + { + Shader& s = shaders[i]; + s.source = readShaderSource(s.filename); + if ( shaders[i].source.length() == 0 ) + { + std::cerr << "Failed to read " << s.filename << std::endl; + error = true; + } + + GLuint shader = glCreateShader( s.type ); + const char *c_str = s.source.c_str(); + glShaderSource( shader, 1, (const GLchar**) &c_str, NULL ); + glCompileShader( shader ); + + GLint compiled; + glGetShaderiv( shader, GL_COMPILE_STATUS, &compiled ); + if ( !compiled ) + { + std::cerr << s.filename << " failed to compile:" << std::endl; + printShaderCompileError(shader); + error = true; + } + + glAttachShader( program, shader ); + } + + /* link and error check */ + glLinkProgram(program); + + GLint linked; + glGetProgramiv( program, GL_LINK_STATUS, &linked ); + if ( !linked ) + { + std::cerr << "Shader program failed to link" << std::endl; + printProgramLinkError(program); + + error = true; + } + + if(error == true) + { + return -1; + } + + /* use program object */ + glUseProgram(program); + return program; } \ No newline at end of file