void GLSLProgram::createFromSourceStrings ( GLSLProgram & prog, const std::string &shader, unsigned int shaderType, const GLuint & geomIn , const GLuint & geomOut ) { prog.clear(); prog.handle_ = glCreateProgram(); prog._geomIn = geomIn; prog._geomOut = geomOut; switch ( shaderType ) { case GL_VERTEX_SHADER_ARB: prog.vertex_ = new GLSLShader ( shader, shaderType ); prog.attach ( prog.vertex_ ); break; case GL_GEOMETRY_SHADER_EXT: prog.geometry_ = new GLSLShader ( shader, shaderType ); prog.attach ( prog.geometry_ ); if ( ( prog._geomIn == 0 ) || ( prog._geomOut == 0 ) ) { _ERROR ( "invalid geomin/geomout" ); throw "invalid geomin/geomout at "; } break; case GL_FRAGMENT_SHADER_ARB: prog.fragment_ = new GLSLShader ( shader, shaderType ); prog.attach ( prog.fragment_ ); break; } prog.link(); }
void GLSLProgram::createFromSourceStrings ( GLSLProgram &prog, const std::string &vertexShader, const std::string &geometryShader, const std::string &fragmentShader, const GLuint &geomIn, const GLuint &geomOut ) { prog.clear(); prog.handle_ = glCreateProgram(); prog._geomIn = geomIn; prog._geomOut = geomOut; if ( vertexShader.size() != 0 ) { prog.vertex_ = new GLSLShader ( GL_VERTEX_SHADER_ARB ); prog.vertex_->setShaderSource ( vertexShader ); prog.vertex_->compile(); prog.attach ( prog.vertex_ ); } if ( geometryShader.size() != 0 ) { prog.geometry_ = new GLSLShader ( GL_GEOMETRY_SHADER_EXT ); prog.geometry_->setShaderSource ( geometryShader ); prog.geometry_->compile(); prog.attach ( prog.geometry_ ); } if ( fragmentShader.size() != 0 ) { prog.fragment_ = new GLSLShader ( GL_FRAGMENT_SHADER_ARB ); prog.fragment_->setShaderSource ( fragmentShader ); prog.fragment_->compile(); prog.attach ( prog.fragment_ ); } prog.link(); }