// Adds a new fragment shader to the pass. // If a fragment shader already exists within the pass, it will be released. FCDEffectPassShader* FCDEffectPass::AddFragmentShader() { FCDEffectPassShader* fragmentShader; for (fragmentShader = GetFragmentShader(); fragmentShader != NULL; fragmentShader = GetFragmentShader()) { SAFE_RELEASE(fragmentShader); } fragmentShader = AddShader(); fragmentShader->AffectsFragments(); SetNewChildFlag(); return fragmentShader; }
const Ogre::MaterialPtr& MaterialGenerator::GetMaterial(Perm permutation) { // Check if material/shader permutation already was generated MaterialMap::iterator i = mMaterials.find(permutation); if (i != mMaterials.end()) { return i->second; } else { // Create it Ogre::MaterialPtr templ = GetTemplateMaterial(permutation & mMatMask); Ogre::GpuProgramPtr vs = GetVertexShader(permutation & mVsMask); Ogre::GpuProgramPtr fs = GetFragmentShader(permutation & mFsMask); // Create material name string name = mMaterialBaseName + Ogre::StringConverter::toString(permutation); // Create material from template, and set shaders Ogre::MaterialPtr mat = templ->clone(name); Ogre::Technique* tech = mat->getTechnique(0); Ogre::Pass* pass = tech->getPass(0); pass->setFragmentProgram(fs->getName()); pass->setVertexProgram(vs->getName()); // And store it mMaterials[permutation] = mat; return mMaterials[permutation]; } }
void Shader::LinkProgram() { p = glCreateProgramObjectARB(); for ( std::vector< std::string >::iterator it = vertexes.begin(), it2 = vertexes.end(); it != it2; ++it ) { int s = GetVertexShader( *it ); glAttachObjectARB( p, s ); } for ( std::vector< std::string >::iterator it = fragments.begin(), it2 = fragments.end(); it != it2; ++it ) { int s = GetFragmentShader( *it ); glAttachObjectARB( p, s ); } glLinkProgramARB( p ); BindProgram(); }