//------------------------------------------------------- Ogre::Material* Ground::CreateGroundMaterialTextured(const std::string & name, const Ogre::Image* texture) { Ogre::TexturePtr heightMapTexture = Ogre::TextureManager::getSingleton().loadImage("Texture/Terrain", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, *texture); Ogre::MaterialPtr material = Ogre::MaterialManager::getSingleton().create(name, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); { Ogre::Technique* techniqueGL = material->getTechnique(0); Ogre::Pass* pass = techniqueGL->getPass(0); { auto vprogram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram("Shader/" + CLASS_NAME + "/GL/Textured/V", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "glsl", Ogre::GPT_VERTEX_PROGRAM); vprogram->setSource(Shader_GL_Simple_V); //auto vparams = vprogram->createParameters(); //vparams->setNamedAutoConstant("modelviewproj", Ogre::GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX); pass->setVertexProgram(vprogram->getName()); } { auto fprogram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram("Shader/" + CLASS_NAME + "/GL/Textured/F", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "glsl", Ogre::GPT_FRAGMENT_PROGRAM); fprogram->setSource(Shader_GL_Simple_F); auto unit0 = pass->createTextureUnitState(heightMapTexture->getName()); unit0->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); unit0->setTextureFiltering(Ogre::TFO_NONE); pass->setFragmentProgram(fprogram->getName()); } } #if !NDEBUG material->load(); #endif return material.get(); }
//----------------------------------------------------------------------- TextureUnitState::TextureUnitState( Pass* parent, const String& texName, unsigned int texCoordSet) : mCurrentFrame(0) , mAnimDuration(0) , mCubic(false) , mTextureType(TEX_TYPE_2D) , mDesiredFormat(PF_UNKNOWN) , mTextureSrcMipmaps(MIP_DEFAULT) , mTextureCoordSetIndex(0) , mBorderColour(ColourValue::Black) , mTextureLoadFailed(false) , mIsAlpha(false) , mHwGamma(false) , mRecalcTexMatrix(false) , mUMod(0) , mVMod(0) , mUScale(1) , mVScale(1) , mRotate(0) , mTexModMatrix(Matrix4::IDENTITY) , mMinFilter(FO_LINEAR) , mMagFilter(FO_LINEAR) , mMipFilter(FO_POINT) , mMaxAniso(MaterialManager::getSingleton().getDefaultAnisotropy()) , mMipmapBias(0) , mIsDefaultAniso(true) , mIsDefaultFiltering(true) , mBindingType(BT_FRAGMENT) , mContentType(CONTENT_NAMED) , mParent(parent) , mAnimController(0) { mColourBlendMode.blendType = LBT_COLOUR; mAlphaBlendMode.operation = LBX_MODULATE; mAlphaBlendMode.blendType = LBT_ALPHA; mAlphaBlendMode.source1 = LBS_TEXTURE; mAlphaBlendMode.source2 = LBS_CURRENT; setColourOperation(LBO_MODULATE); setTextureAddressingMode(TAM_WRAP); setTextureName(texName); setTextureCoordSet(texCoordSet); if( Pass::getHashFunction() == Pass::getBuiltinHashFunction( Pass::MIN_TEXTURE_CHANGE ) ) { mParent->_dirtyHash(); } }
//----------------------------------------------------------------------- void TextureUnitState::setTexture( const TexturePtr& texPtr) { if (!texPtr) { OGRE_EXCEPT(Exception::ERR_ITEM_NOT_FOUND, "Texture Pointer is empty.", "TextureUnitState::setTexture"); } setContentType(CONTENT_NAMED); mTextureLoadFailed = false; if (texPtr->getTextureType() == TEX_TYPE_CUBE_MAP) { // delegate to cubic texture implementation setCubicTexture(&texPtr, true); return; } if (texPtr->getTextureType() == TEX_TYPE_EXTERNAL_OES || texPtr->getTextureType() == TEX_TYPE_2D_RECT) { setTextureAddressingMode( TAM_CLAMP ); } mFramePtrs.resize(1); mFramePtrs[0] = texPtr; mCurrentFrame = 0; mCubic = false; // Load immediately ? if (isLoaded()) { _load(); // reload } // Tell parent to recalculate hash if( Pass::getHashFunction() == Pass::getBuiltinHashFunction( Pass::MIN_TEXTURE_CHANGE ) ) { mParent->_dirtyHash(); } }
virtual MaterialsVector CreateEffectMaterialPrototypes() override { Ogre::MaterialPtr materialThreshold = Ogre::MaterialManager::getSingleton().create( "Material/PostEffect/" + GetUniquePostfix() + "/Threshold", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); { Ogre::Technique* techniqueGL = materialThreshold->getTechnique(0); Ogre::Pass* pass = techniqueGL->getPass(0); { auto vprogram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram("Shader/GL/V/Threshold/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "glsl", Ogre::GPT_VERTEX_PROGRAM); vprogram->setSource(Shader_GL_Common_V); pass->setVertexProgram(vprogram->getName()); } { auto fprogram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram("Shader/GL/F/Threshold/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "glsl", Ogre::GPT_FRAGMENT_PROGRAM); fprogram->setSource(Shader_GL_Threshold_F); auto unit0 = pass->createTextureUnitState(TEXTURE_MARKER_SCENE); unit0->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); unit0->setTextureFiltering(Ogre::TFO_NONE); pass->setFragmentProgram(fprogram->getName()); } } auto outputThreshold = CreateOutputTexture(materialThreshold->getName(), mRenderWindow->getWidth() / 2, mRenderWindow->getHeight() / 2); //------------------------------------------------------- Ogre::MaterialPtr materialDownsample = Ogre::MaterialManager::getSingleton().create( "Material/Downsample/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); { Ogre::Technique* techniqueGL = materialDownsample->getTechnique(0); Ogre::Pass* pass = techniqueGL->getPass(0); { auto vprogram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram("Shader/GL/V/DS/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "glsl", Ogre::GPT_VERTEX_PROGRAM); vprogram->setSource(Shader_GL_Common_V); pass->setVertexProgram(vprogram->getName()); } { auto fprogram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram("Shader/GL/F/DS/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "glsl", Ogre::GPT_FRAGMENT_PROGRAM); fprogram->setSource(Shader_GL_Copy_F); auto unit0 = pass->createTextureUnitState(outputThreshold); unit0->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); unit0->setTextureFiltering(Ogre::TFO_BILINEAR); pass->setFragmentProgram(fprogram->getName()); } } auto outputDownsample = CreateOutputTexture(materialDownsample->getName(), mRenderWindow->getWidth() / 4, mRenderWindow->getHeight() / 4); //------------------------------------------------------- Ogre::MaterialPtr materialDownsample2 = Ogre::MaterialManager::getSingleton().create( "Material/Downsample2/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); { Ogre::Technique* techniqueGL = materialDownsample2->getTechnique(0); Ogre::Pass* pass = techniqueGL->getPass(0); { auto vprogram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram("Shader/GL/V/DS2/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "glsl", Ogre::GPT_VERTEX_PROGRAM); vprogram->setSource(Shader_GL_Common_V); pass->setVertexProgram(vprogram->getName()); } { auto fprogram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram("Shader/GL/F/DS2/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "glsl", Ogre::GPT_FRAGMENT_PROGRAM); fprogram->setSource(Shader_GL_Copy_F); auto unit0 = pass->createTextureUnitState(outputDownsample); unit0->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); unit0->setTextureFiltering(Ogre::TFO_BILINEAR); pass->setFragmentProgram(fprogram->getName()); } } auto outputDownsample2 = CreateOutputTexture(materialDownsample2->getName(), mRenderWindow->getWidth() / 8, mRenderWindow->getHeight() / 8); //------------------------------------------------------- Ogre::MaterialPtr materialHorz = Ogre::MaterialManager::getSingleton().create( "Material/PostEffect/" + GetUniquePostfix() + "/Horz", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); { Ogre::Technique* techniqueGL = materialHorz->getTechnique(0); Ogre::Pass* pass = techniqueGL->getPass(0); { auto vprogram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram("Shader/GL/V/H/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "glsl", Ogre::GPT_VERTEX_PROGRAM); vprogram->setSource(Shader_GL_Common_V); pass->setVertexProgram(vprogram->getName()); } { auto fprogram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram("Shader/GL/F/H/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "glsl", Ogre::GPT_FRAGMENT_PROGRAM); fprogram->setSource(Shader_GL_Blur_Horz_F); auto unit0 = pass->createTextureUnitState(outputDownsample2); unit0->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); unit0->setTextureFiltering(Ogre::TFO_BILINEAR); pass->setFragmentProgram(fprogram->getName()); auto fparams = pass->getFragmentProgramParameters(); fparams->setNamedConstant("texture", 0); fparams->setNamedAutoConstant("offset", Ogre::GpuProgramParameters::ACT_VIEWPORT_SIZE); } } auto outputHorz = CreateOutputTexture(materialHorz->getName(), mRenderWindow->getWidth() / 8, mRenderWindow->getHeight() / 8); //------------------------------------------------------- Ogre::MaterialPtr materialVert = Ogre::MaterialManager::getSingleton().create( "Material/PostEffect/" + GetUniquePostfix() + "/Vert", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); { Ogre::Technique* techniqueGL = materialVert->getTechnique(0); Ogre::Pass* pass = techniqueGL->getPass(0); { auto vprogram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram("Shader/GL/V/V/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "glsl", Ogre::GPT_VERTEX_PROGRAM); vprogram->setSource(Shader_GL_Common_V); pass->setVertexProgram(vprogram->getName()); } { auto fprogram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram("Shader/GL/F/V/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "glsl", Ogre::GPT_FRAGMENT_PROGRAM); fprogram->setSource(Shader_GL_Blur_Vert_F); auto unit0 = pass->createTextureUnitState(outputHorz); unit0->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); unit0->setTextureFiltering(Ogre::TFO_BILINEAR); pass->setFragmentProgram(fprogram->getName()); auto fparams = pass->getFragmentProgramParameters(); fparams->setNamedConstant("texture", 0); fparams->setNamedAutoConstant("offset", Ogre::GpuProgramParameters::ACT_VIEWPORT_SIZE); } } auto outputVert = CreateOutputTexture(materialVert->getName(), mRenderWindow->getWidth() / 8, mRenderWindow->getHeight() / 8); //------------------------------------------------------- Ogre::MaterialPtr materialBlend = Ogre::MaterialManager::getSingleton().create( "Material/Blend/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); { Ogre::Technique* techniqueGL = materialBlend->getTechnique(0); Ogre::Pass* pass = techniqueGL->getPass(0); { auto vprogram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram("Shader/GL/V/Blend/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "glsl", Ogre::GPT_VERTEX_PROGRAM); vprogram->setSource(Shader_GL_Common_V); pass->setVertexProgram(vprogram->getName()); } { auto fprogram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram("Shader/GL/F/Blend/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "glsl", Ogre::GPT_FRAGMENT_PROGRAM); fprogram->setSource(Shader_GL_Blend_F); auto unit0 = pass->createTextureUnitState(TEXTURE_MARKER_SCENE); unit0->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); unit0->setTextureFiltering(Ogre::TFO_NONE); auto unit1 = pass->createTextureUnitState(outputVert); unit1->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); unit1->setTextureFiltering(Ogre::TFO_BILINEAR); pass->setFragmentProgram(fprogram->getName()); auto fparams = pass->getFragmentProgramParameters(); fparams->setNamedConstant("texture", 0); fparams->setNamedConstant("texbloom", 1); } } //------------------------------------------------------- return{ materialThreshold.get(), materialDownsample.get(), materialDownsample2.get(), materialHorz.get(), materialVert.get(), materialBlend.get() }; }
virtual MaterialsVector CreateEffectMaterialPrototypes() override { Ogre::MaterialPtr material1 = Ogre::MaterialManager::getSingleton().create( "Material/Downsample1/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); { Ogre::Technique* techniqueGL = material1->getTechnique(0); Ogre::Pass* pass = techniqueGL->getPass(0); { auto vprogram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram("Shader/GL/V/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "glsl", Ogre::GPT_VERTEX_PROGRAM); vprogram->setSource(Shader_GL_Copy_V); pass->setVertexProgram(vprogram->getName()); } { auto fprogram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram("Shader/GL/F/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "glsl", Ogre::GPT_FRAGMENT_PROGRAM); fprogram->setSource(Shader_GL_Copy_F); auto unit0 = pass->createTextureUnitState(TEXTURE_MARKER_SCENE); unit0->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); unit0->setTextureFiltering(Ogre::TFO_NONE); pass->setFragmentProgram(fprogram->getName()); } } auto output1 = CreateOutputTexture(material1->getName(), mRenderWindow->getWidth() / 2, mRenderWindow->getHeight() / 2); Ogre::MaterialPtr material2 = Ogre::MaterialManager::getSingleton().create( "Material/Downsample2/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); { Ogre::Technique* techniqueGL = material2->getTechnique(0); Ogre::Pass* pass = techniqueGL->getPass(0); { auto vprogram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram("Shader/GL/V/2/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "glsl", Ogre::GPT_VERTEX_PROGRAM); vprogram->setSource(Shader_GL_Copy_V); pass->setVertexProgram(vprogram->getName()); } { auto fprogram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram("Shader/GL/F/2/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "glsl", Ogre::GPT_FRAGMENT_PROGRAM); fprogram->setSource(Shader_GL_Copy_F); auto unit0 = pass->createTextureUnitState(output1); unit0->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); unit0->setTextureFiltering(Ogre::TFO_NONE); pass->setFragmentProgram(fprogram->getName()); } } auto output2 = CreateOutputTexture(material2->getName(), mRenderWindow->getWidth() / 4, mRenderWindow->getHeight() / 4); Ogre::MaterialPtr material3 = Ogre::MaterialManager::getSingleton().create( "Material/Downsample3/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); { Ogre::Technique* techniqueGL = material3->getTechnique(0); Ogre::Pass* pass = techniqueGL->getPass(0); { auto vprogram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram("Shader/GL/V/3/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "glsl", Ogre::GPT_VERTEX_PROGRAM); vprogram->setSource(Shader_GL_Copy_V); pass->setVertexProgram(vprogram->getName()); } { auto fprogram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram("Shader/GL/F/3/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "glsl", Ogre::GPT_FRAGMENT_PROGRAM); fprogram->setSource(Shader_GL_Copy_F); auto unit0 = pass->createTextureUnitState(output2); unit0->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); unit0->setTextureFiltering(Ogre::TFO_NONE); pass->setFragmentProgram(fprogram->getName()); } } auto output3 = CreateOutputTexture(material3->getName(), mRenderWindow->getWidth() / 8, mRenderWindow->getHeight() / 8); Ogre::MaterialPtr material4 = Ogre::MaterialManager::getSingleton().create( "Material/Downsample4/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); { Ogre::Technique* techniqueGL = material4->getTechnique(0); Ogre::Pass* pass = techniqueGL->getPass(0); { auto vprogram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram("Shader/GL/V/4/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "glsl", Ogre::GPT_VERTEX_PROGRAM); vprogram->setSource(Shader_GL_Copy_V); pass->setVertexProgram(vprogram->getName()); } { auto fprogram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram("Shader/GL/F/4/" + GetUniquePostfix(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "glsl", Ogre::GPT_FRAGMENT_PROGRAM); fprogram->setSource(Shader_GL_Copy_F); auto unit0 = pass->createTextureUnitState(output3); unit0->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); unit0->setTextureFiltering(Ogre::TFO_NONE); pass->setFragmentProgram(fprogram->getName()); } } return { material1.get(), material2.get(), material3.get(), material4.get() }; }