//----------------------------------------------------------------------- void DeferredLightRenderOperation::execute(SceneManager *sm, RenderSystem *rs) { Ogre::Camera* cam = mViewport->getCamera(); mAmbientLight->updateFromCamera(cam); Technique* tech = mAmbientLight->getMaterial()->getBestTechnique(); injectTechnique(sm, tech, mAmbientLight, 0); const LightList& lightList = sm->_getLightsAffectingFrustum(); for (LightList::const_iterator it = lightList.begin(); it != lightList.end(); it++) { Light* light = *it; Ogre::LightList ll; ll.push_back(light); //if (++i != 2) continue; //if (light->getType() != Light::LT_DIRECTIONAL) continue; //if (light->getDiffuseColour() != ColourValue::Red) continue; LightsMap::iterator dLightIt = mLights.find(light); DLight* dLight = 0; if (dLightIt == mLights.end()) { dLight = createDLight(light); } else { dLight = dLightIt->second; dLight->updateFromParent(); } dLight->updateFromCamera(cam); tech = dLight->getMaterial()->getBestTechnique(); //Update shadow texture if (dLight->getCastChadows()) { SceneManager::RenderContext* context = sm->_pauseRendering(); sm->prepareShadowTextures(cam, mViewport, &ll); sm->_resumeRendering(context); Pass* pass = tech->getPass(0); TextureUnitState* tus = pass->getTextureUnitState("ShadowMap"); assert(tus); const TexturePtr& shadowTex = sm->getShadowTexture(0); if (tus->_getTexturePtr() != shadowTex) { tus->_setTexturePtr(shadowTex); } } injectTechnique(sm, tech, dLight, &ll); } }
// 替换指定纹理层的纹理 bool TerrainImpl::setPaintTexutreName(size_t nPaintChannel , const String &strTextureName) { Technique *pTech = mMaterial->getTechnique(0); Pass *pass = pTech->getPass(nPaintChannel / SPLATTING_TEXTURE_NUM); if(pass) { TextureUnitState *texture = pass->getTextureUnitState(COVERAGE_TEXTURE_NUM + (nPaintChannel % SPLATTING_TEXTURE_NUM)); if(texture) { texture->setTextureName(strTextureName); return texture->getTextureName() == strTextureName && !texture->_getTexturePtr().isNull() && texture->_getTexturePtr()->isLoaded(); } } return false; }
//----------------------------------------------------------------------- void RenderSystem::_setTextureUnitSettings(size_t texUnit, TextureUnitState& tl) { // This method is only ever called to set a texture unit to valid details // The method _disableTextureUnit is called to turn a unit off const TexturePtr& tex = tl._getTexturePtr(); // Vertex texture binding? if (mCurrentCapabilities->hasCapability(RSC_VERTEX_TEXTURE_FETCH) && !mCurrentCapabilities->getVertexTextureUnitsShared()) { if (tl.getBindingType() == TextureUnitState::BT_VERTEX) { // Bind vertex texture _setVertexTexture(texUnit, tex); // bind nothing to fragment unit (hardware isn't shared but fragment // unit can't be using the same index _setTexture(texUnit, true, sNullTexPtr); } else { // vice versa _setVertexTexture(texUnit, sNullTexPtr); _setTexture(texUnit, true, tex); } } else { // Shared vertex / fragment textures or no vertex texture support // Bind texture (may be blank) _setTexture(texUnit, true, tex); } // Set texture coordinate set _setTextureCoordSet(texUnit, tl.getTextureCoordSet()); // Set texture layer filtering _setTextureUnitFiltering(texUnit, tl.getTextureFiltering(FT_MIN), tl.getTextureFiltering(FT_MAG), tl.getTextureFiltering(FT_MIP)); // Set texture layer filtering _setTextureLayerAnisotropy(texUnit, tl.getTextureAnisotropy()); // Set mipmap biasing _setTextureMipmapBias(texUnit, tl.getTextureMipmapBias()); // Set blend modes // Note, colour before alpha is important _setTextureBlendMode(texUnit, tl.getColourBlendMode()); _setTextureBlendMode(texUnit, tl.getAlphaBlendMode()); // Texture addressing mode const TextureUnitState::UVWAddressingMode& uvw = tl.getTextureAddressingMode(); _setTextureAddressingMode(texUnit, uvw); // Set texture border colour only if required if (uvw.u == TextureUnitState::TAM_BORDER || uvw.v == TextureUnitState::TAM_BORDER || uvw.w == TextureUnitState::TAM_BORDER) { _setTextureBorderColour(texUnit, tl.getTextureBorderColour()); } // Set texture effects TextureUnitState::EffectMap::iterator effi; // Iterate over new effects bool anyCalcs = false; for (effi = tl.mEffects.begin(); effi != tl.mEffects.end(); ++effi) { switch (effi->second.type) { case TextureUnitState::ET_ENVIRONMENT_MAP: if (effi->second.subtype == TextureUnitState::ENV_CURVED) { _setTextureCoordCalculation(texUnit, TEXCALC_ENVIRONMENT_MAP); anyCalcs = true; } else if (effi->second.subtype == TextureUnitState::ENV_PLANAR) { _setTextureCoordCalculation(texUnit, TEXCALC_ENVIRONMENT_MAP_PLANAR); anyCalcs = true; } else if (effi->second.subtype == TextureUnitState::ENV_REFLECTION) { _setTextureCoordCalculation(texUnit, TEXCALC_ENVIRONMENT_MAP_REFLECTION); anyCalcs = true; } else if (effi->second.subtype == TextureUnitState::ENV_NORMAL) { _setTextureCoordCalculation(texUnit, TEXCALC_ENVIRONMENT_MAP_NORMAL); anyCalcs = true; } break; case TextureUnitState::ET_UVSCROLL: case TextureUnitState::ET_USCROLL: case TextureUnitState::ET_VSCROLL: case TextureUnitState::ET_ROTATE: case TextureUnitState::ET_TRANSFORM: break; case TextureUnitState::ET_PROJECTIVE_TEXTURE: _setTextureCoordCalculation(texUnit, TEXCALC_PROJECTIVE_TEXTURE, effi->second.frustum); anyCalcs = true; break; } } // Ensure any previous texcoord calc settings are reset if there are now none if (!anyCalcs) { _setTextureCoordCalculation(texUnit, TEXCALC_NONE); } // Change tetxure matrix _setTextureMatrix(texUnit, tl.getTextureTransform()); }