ShaderProgram::ShaderProgram( const string &filename, const VertexShader &vertexShader, const FragmentShader &fragmentShader) : _name(filename), _handle(0), _linked(0) { try { if (vertexShader.fail()) throw std::runtime_error("Invalid vertex shader"); if (fragmentShader.fail()) throw std::runtime_error("Invalid fragment shader"); if (GLEW_VERSION_2_0) { // Create program and attach vertex and fragment shaders _handle = glCreateProgram(); glAttachShader(_handle, vertexShader.handle()); glAttachShader(_handle, fragmentShader.handle()); // Perform link stage glLinkProgram(_handle); glGetProgramiv(_handle, GL_LINK_STATUS, &_linked); // Validate program glValidateProgram(_handle); printInfoLog(); // Check for success if (GL_FALSE == _linked) throw std::runtime_error("Link stage failed"); } else if (GLEW_VERSION_1_5) { // Create program and attach vertex and fragment shaders _handle = glCreateProgramObjectARB(); glAttachObjectARB(_handle, vertexShader.handle()); glAttachObjectARB(_handle, fragmentShader.handle()); // Perform link stage glLinkProgramARB(_handle); glGetObjectParameterivARB(_handle, GL_OBJECT_LINK_STATUS_ARB, &_linked); // Validate program glValidateProgramARB(_handle); printInfoLog(); // Check for success if (GL_FALSE == _linked) throw std::runtime_error("Link stage failed"); } cout << "* Shader \"" << _name << "\" successfully linked" << endl; } catch (std::runtime_error &err) { cerr << "Error: Faild to create shader " << _name << endl; cerr << "Reason: " << err.what() << endl; } }