void setUpBaseParameters(const Ogre::GpuProgramParametersSharedPtr& params) { assert(params.isNull()==false); struct AutoParamPair { Ogre::String name; Ogre::GpuProgramParameters::AutoConstantType type; }; //A list of auto params that might be present in the shaders generated static const AutoParamPair AUTO_PARAMS[] = { { "vpWidth", Ogre::GpuProgramParameters::ACT_VIEWPORT_WIDTH }, { "vpHeight", Ogre::GpuProgramParameters::ACT_VIEWPORT_HEIGHT }, { "worldView", Ogre::GpuProgramParameters::ACT_WORLDVIEW_MATRIX }, { "invProj", Ogre::GpuProgramParameters::ACT_INVERSE_PROJECTION_MATRIX }, { "invView", Ogre::GpuProgramParameters::ACT_INVERSE_VIEW_MATRIX }, { "flip", Ogre::GpuProgramParameters::ACT_RENDER_TARGET_FLIPPING }, { "lightDiffuseColor", Ogre::GpuProgramParameters::ACT_LIGHT_DIFFUSE_COLOUR }, { "lightSpecularColor", Ogre::GpuProgramParameters::ACT_LIGHT_SPECULAR_COLOUR }, { "lightFalloff", Ogre::GpuProgramParameters::ACT_LIGHT_ATTENUATION }, { "lightPos", Ogre::GpuProgramParameters::ACT_LIGHT_POSITION_VIEW_SPACE }, { "lightDir", Ogre::GpuProgramParameters::ACT_LIGHT_DIRECTION_VIEW_SPACE }, { "spotParams", Ogre::GpuProgramParameters::ACT_SPOTLIGHT_PARAMS }, { "farClipDistance", Ogre::GpuProgramParameters::ACT_FAR_CLIP_DISTANCE }, { "shadowViewProjMat", Ogre::GpuProgramParameters::ACT_TEXTURE_VIEWPROJ_MATRIX } }; int numParams = sizeof(AUTO_PARAMS) / sizeof(AutoParamPair); for (int i=0; i<numParams; i++) { if (params->_findNamedConstantDefinition(AUTO_PARAMS[i].name)) { params->setNamedAutoConstant(AUTO_PARAMS[i].name, AUTO_PARAMS[i].type); } } }
void WaterMaterialGenerator::individualFragmentProgramParams(Ogre::GpuProgramParametersSharedPtr params) { // can't set a vector2, need to pack it in vector3 #define _vec3(prop) Vector3(prop.x, prop.y, 1.0) params->setIgnoreMissingParams(true); params->setNamedConstant("enableShadows", Real(1.f)); params->setNamedConstant("waveBump_Speed_HighFreq_Spec", mDef->mProps->waveBump_Speed_HighFreq_Spec); params->setNamedConstant("depthPars", mDef->mProps->depthPars); params->setNamedConstant("depthColor", mDef->mProps->depthColour); params->setNamedConstant("deepColor", mDef->mProps->deepColour); params->setNamedConstant("shallowColor", mDef->mProps->shallowColour); params->setNamedConstant("reflectionColor", mDef->mProps->reflectionColour); params->setNamedConstant("matSpec", mDef->mProps->specular); params->setNamedConstant("reflVal_Refl2_Distort_Opacity", mDef->mProps->reflVal_Refl2_Distort_Opacity); params->setNamedConstant("fresnelPowerBias", Vector3(mDef->mProps->fresnelPower, mDef->mProps->fresnelBias, 0)); if (needShadows()) { params->setNamedConstant("pssmSplitPoints", mParent->pApp->splitPoints); for (int i=0; i<mParent->getNumShadowTex(); ++i) params->setNamedAutoConstant("invShadowMapSize"+toStr(i), GpuProgramParameters::ACT_INVERSE_TEXTURE_SIZE, i+mShadowTexUnit_start); } }
void WaterMaterialGenerator::individualVertexProgramParams(Ogre::GpuProgramParametersSharedPtr params) { params->setIgnoreMissingParams(true); //! workaround 'Parameter texWorldViewProjMatrix0 does not exist' - no idea why its happening if (needShadows()) for (int i=0; i<mParent->getNumShadowTex(); ++i) { params->setNamedAutoConstant("texWorldViewProjMatrix"+toStr(i), GpuProgramParameters::ACT_TEXTURE_WORLDVIEWPROJ_MATRIX, i); } }
//----------------------------------------------------------------------- void ParticleRenderer::_createSoftMaterial(void) { Ogre::String newMaterialName = SOFT_PREFIX + mParentTechnique->getMaterialName(); if (!Ogre::MaterialManager::getSingletonPtr()->getByName(newMaterialName).isNull()) { mParentTechnique->setMaterialName(newMaterialName); return; } // Create a new material for soft particles if (mUseSoftParticles && mNotifiedDepthMap) { // Create Vertex program Ogre::String softVertexName = "ParticleUniverse_SoftVP"; // Use ParticleUniverse_ to avoid name conflicts. Ogre::HighLevelGpuProgramPtr vertexProgram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram( softVertexName, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "hlsl", Ogre::GPT_VERTEX_PROGRAM); vertexProgram->setSourceFile("pu_soft_sm20.hlsl"); vertexProgram->setParameter("target", "vs_2_0"); vertexProgram->setParameter("entry_point", "mainVP"); // Must be same name as in pu_soft_sm20.hlsl vertexProgram->load(); Ogre::String softFragmentName = "ParticleUniverse_SoftFP"; // Use ParticleUniverse_ to avoid name conflicts. Ogre::HighLevelGpuProgramPtr fragmentProgram = Ogre::HighLevelGpuProgramManager::getSingleton().createProgram( softFragmentName, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "hlsl", Ogre::GPT_FRAGMENT_PROGRAM); fragmentProgram->setSourceFile("pu_soft_sm20.hlsl"); fragmentProgram->setParameter("target", "ps_2_0"); fragmentProgram->setParameter("entry_point", "mainFP"); // Must be same name as in pu_soft_sm20.hlsl fragmentProgram->load(); Ogre::String resourceGroupName = mParentTechnique->getParentSystem() ? mParentTechnique->getParentSystem()->getResourceGroupName() : Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME; // Create material with depth texture Ogre::MaterialPtr newMaterial = Ogre::MaterialManager::getSingleton().getByName(newMaterialName); if (!newMaterial.getPointer()) { newMaterial = Ogre::MaterialManager::getSingleton().create(newMaterialName, resourceGroupName); Ogre::Pass* newPass = newMaterial->getTechnique(0)->getPass(0); newPass->setDepthCheckEnabled(true); newPass->setDepthWriteEnabled(false); newPass->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA); newPass->createTextureUnitState(ParticleSystemManager::getSingleton().getDepthTextureName()); // Get the first texture from the old material (assume it has at least 1 technique and one pass) Ogre::Pass* oldPass = mParentTechnique->getMaterial()->getBestTechnique()->getPass(0); newPass->setLightingEnabled(oldPass->getLightingEnabled()); if (oldPass->getNumTextureUnitStates() > 0) { Ogre::TextureUnitState* oldTextureUnitState = oldPass->getTextureUnitState(0); newPass->createTextureUnitState(oldTextureUnitState->getTextureName()); } // Set the vertex and fragment parameters newPass->setVertexProgram(softVertexName); newPass->setFragmentProgram(softFragmentName); Ogre::GpuProgramParametersSharedPtr vertexParams = newPass->getVertexProgramParameters(); vertexParams->setNamedAutoConstant("worldViewProj", Ogre::GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX); vertexParams->setNamedAutoConstant("depthRange", Ogre::GpuProgramParameters::ACT_SCENE_DEPTH_RANGE); // Depth scale must be the same as used in creation of the depth map vertexParams->setNamedConstant("depthScale", ParticleSystemManager::getSingleton().getDepthScale()); Ogre::GpuProgramParametersSharedPtr fragmentParams = newPass->getFragmentProgramParameters(); fragmentParams->setNamedConstant("contrastPower", mSoftParticlesContrastPower); fragmentParams->setNamedConstant("scale", mSoftParticlesScale); fragmentParams->setNamedConstant("delta", mSoftParticlesDelta); } // Set the new material mParentTechnique->setMaterialName(newMaterialName); } }