//--------------------------------------------------------------------- void TerrainMaterialGeneratorA::SM2Profile::ShaderHelper::defaultFpParams( const SM2Profile* prof, const Terrain* terrain, TechniqueType tt, const HighLevelGpuProgramPtr& prog) { GpuProgramParametersSharedPtr params = prog->getDefaultParameters(); params->setIgnoreMissingParams(true); params->setNamedAutoConstant("ambient", GpuProgramParameters::ACT_AMBIENT_LIGHT_COLOUR); params->setNamedAutoConstant("lightPosObjSpace", GpuProgramParameters::ACT_LIGHT_POSITION_OBJECT_SPACE, 0); params->setNamedAutoConstant("lightDiffuseColour", GpuProgramParameters::ACT_LIGHT_DIFFUSE_COLOUR, 0); params->setNamedAutoConstant("lightSpecularColour", GpuProgramParameters::ACT_LIGHT_SPECULAR_COLOUR, 0); params->setNamedAutoConstant("eyePosObjSpace", GpuProgramParameters::ACT_CAMERA_POSITION_OBJECT_SPACE); params->setNamedAutoConstant("fogColour", GpuProgramParameters::ACT_FOG_COLOUR); if (prof->isShadowingEnabled(tt, terrain)) { uint numTextures = 1; if (prof->getReceiveDynamicShadowsPSSM()) { PSSMShadowCameraSetup* pssm = prof->getReceiveDynamicShadowsPSSM(); numTextures = (uint)pssm->getSplitCount(); Vector4 splitPoints; const PSSMShadowCameraSetup::SplitPointList& splitPointList = pssm->getSplitPoints(); // Populate from split point 1, not 0, since split 0 isn't useful (usually 0) for (uint i = 1; i < numTextures; ++i) { splitPoints[i-1] = splitPointList[i]; } params->setNamedConstant("pssmSplitPoints", splitPoints); } if (prof->getReceiveDynamicShadowsDepth()) { size_t samplerOffset = (tt == HIGH_LOD) ? mShadowSamplerStartHi : mShadowSamplerStartLo; for (uint i = 0; i < numTextures; ++i) { params->setNamedAutoConstant("inverseShadowmapSize" + StringConverter::toString(i), GpuProgramParameters::ACT_INVERSE_TEXTURE_SIZE, i + samplerOffset); } } } // Explicitly bind samplers for GLSL if ((prof->_getShaderLanguage() == "glsl") || (prof->_getShaderLanguage() == "glsles")) { int numSamplers = 0; if (tt == LOW_LOD) { params->setNamedConstant("compositeMap", (int)numSamplers++); } else { params->setNamedConstant("globalNormal", (int)numSamplers++); if (terrain->getGlobalColourMapEnabled() && prof->isGlobalColourMapEnabled()) { params->setNamedConstant("globalColourMap", (int)numSamplers++); } if (prof->isLightmapEnabled()) { params->setNamedConstant("lightMap", (int)numSamplers++); } uint maxLayers = prof->getMaxLayers(terrain); uint numBlendTextures = std::min(terrain->getBlendTextureCount(maxLayers), terrain->getBlendTextureCount()); uint numLayers = std::min(maxLayers, static_cast<uint>(terrain->getLayerCount())); // Blend textures - sampler definitions for (uint i = 0; i < numBlendTextures; ++i) { params->setNamedConstant("blendTex" + StringConverter::toString(i), (int)numSamplers++); } // Layer textures - sampler definitions & UV multipliers for (uint i = 0; i < numLayers; ++i) { params->setNamedConstant("difftex" + StringConverter::toString(i), (int)numSamplers++); params->setNamedConstant("normtex" + StringConverter::toString(i), (int)numSamplers++); } uint numShadowTextures = 1; if (prof->getReceiveDynamicShadowsPSSM()) numShadowTextures = (uint)prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); for (uint i = 0; i < numShadowTextures; ++i) { if (prof->isShadowingEnabled(tt, terrain)) params->setNamedConstant("shadowMap" + StringConverter::toString(i), (int)numSamplers++); } } } }