//---------------------------------------------------------------------------- MaterialInstance::MaterialInstance (const Material* material, int techniqueIndex) : mMaterial((Material*)material), // conceptual constness mIsShareMtl(false), mTechniqueIndex(techniqueIndex), mNumPasses(0), mVertexParameters(0), mPixelParameters(0), mIsNeedUpdate(false) { assertion(material != 0, "Material must be specified.\n"); assertion( 0 <= techniqueIndex && techniqueIndex < material->GetNumTechniques(), "Invalid technique index.\n"); MaterialTechnique* technique = mMaterial->GetTechnique(mTechniqueIndex); mNumPasses = technique->GetNumPasses(); mVertexParameters = new1<ShaderParametersPtr>(mNumPasses); mPixelParameters = new1<ShaderParametersPtr>(mNumPasses); int p; for (p = 0; p < mNumPasses; ++p) { MaterialPass* pass = technique->GetPass(p); mVertexParameters[p] = new0 ShaderParameters(pass->GetVertexShader()); mVertexParameters[p]->SetName("VParams_" + StringHelp::IntToString(p)); mPixelParameters[p] = new0 ShaderParameters(pass->GetPixelShader()); mPixelParameters[p]->SetName("PParams_" + StringHelp::IntToString(p)); } }
//---------------------------------------------------------------------------- MaterialTechnique *MaterialInstance::_RefreshMaterial( const std::string &mtlFilename, const std::string &intanceTechName, ShaderParametersPtr* &vp, ShaderParametersPtr* &pp, bool shareMtl, MaterialPtr &outMtl, int &outTechIndex) { // we reload the mtl outMtl = PX2_MATERIALMAN.GetMaterial(mtlFilename.c_str(), intanceTechName.c_str(), shareMtl); assertion(outMtl != 0, "Material must be specified.\n"); MaterialTechnique* technique = outMtl->GetTechnique(intanceTechName, outTechIndex); int newNumPass = technique->GetNumPasses(); if (0 == vp) vp = new1<ShaderParametersPtr>(newNumPass); if (0 == pp) pp = new1<ShaderParametersPtr>(newNumPass); for (int p = 0; p < newNumPass; ++p) { MaterialPass* pass = technique->GetPass(p); VertexShader *vs = pass->GetVertexShader(); PixelShader *ps = pass->GetPixelShader(); _CreateConstants(vp[p], vs); _CreateConstants(pp[p], ps); } return technique; }
void MaterialTechnique<RS>::addPass(const MaterialPassDescription& desc) { MaterialPass<RS> mp; mp.setVertexShader(desc.vertexFilename, desc.vertexFunction, desc.vertexDef); mp.setFragmentShader(desc.fragmentFilename, desc.fragmentFunction); for(auto i = desc.samplers.begin(), end = desc.samplers.end(); i<end; i++) { auto op = desc.samplerOptions[i - desc.samplers.begin()]; if(op == MPDO_VERTEX || op == MPDO_BOTH) mp.addSamplerReferenceForVertex(SamplerManager<RS>::getPtr()->getResource(*i)); if(op == MPDO_FRAGMENT || op == MPDO_BOTH) mp.addSamplerReferenceForFragment(SamplerManager<RS>::getPtr()->getResource(*i)); } for(auto i = desc.textures.begin(), end = desc.textures.end(); i<end; i++) { auto op = desc.textureOptions[i - desc.textures.begin()]; if(op == MPDO_VERTEX || op == MPDO_BOTH) mp.addTextureReferenceForVertex(TextureManager<RS>::getPtr()->getResource(*i)); if(op == MPDO_FRAGMENT || op == MPDO_BOTH) mp.addTextureReferenceForFragment(TextureManager<RS>::getPtr()->getResource(*i)); } mp.setBlendState(desc.blendState); mp.finalize(); passes.push_back(Pair<MaterialPass<RS>,MaterialPassDescription>(mp,desc)); }
//---------------------------------------------------------------------------- JunglerMaterial::JunglerMaterial () { VertexShader* vshader = new0 VertexShader("PX2.JunglerMaterial", 3, 3, 8, 0, false); vshader->SetInput(0, "modelPosition", Shader::VT_FLOAT3, Shader::VS_POSITION); vshader->SetInput(1, "modelNormal", Shader::VT_FLOAT3, Shader::VS_NORMAL); vshader->SetInput(2, "modelTCoord0", Shader::VT_FLOAT2, Shader::VS_TEXCOORD0); vshader->SetOutput(0, "clipPosition", Shader::VT_FLOAT4, Shader::VS_POSITION); vshader->SetOutput(1, "vertexTCoord0", Shader::VT_FLOAT2, Shader::VS_TEXCOORD0); vshader->SetOutput(2, "vertexTCoord1", Shader::VT_FLOAT4, Shader::VS_TEXCOORD1); vshader->SetConstant(0, "gPVWMatrix", 4); vshader->SetConstant(1, "gShineEmissive", 1); vshader->SetConstant(2, "gShineAmbient", 1); vshader->SetConstant(3, "gShineDiffuse", 1); vshader->SetConstant(4, "gLightColour", 1); vshader->SetConstant(5, "gLightAttenuation", 1); vshader->SetConstant(6, "gLightModelDirection", 1); vshader->SetConstant(7, "gUser", 1); vshader->SetBaseRegisters(msVRegisters); vshader->SetPrograms(msVPrograms); PixelShader* pshader = new0 PixelShader("PX2.JunglerMaterial", 2, 1, 0, 1, false); pshader->SetInput(0, "vertexTCoord0", Shader::VT_FLOAT2, Shader::VS_TEXCOORD0); pshader->SetInput(1, "vertexTCoord1", Shader::VT_FLOAT4, Shader::VS_TEXCOORD1); pshader->SetOutput(0, "pixelColor", Shader::VT_FLOAT4, Shader::VS_COLOR0); pshader->SetSampler(0, "gDiffuseSampler", Shader::ST_2D); pshader->SetFilter(0, Shader::SF_LINEAR); pshader->SetCoordinate(0, 0, Shader::SC_REPEAT); pshader->SetCoordinate(0, 1, Shader::SC_REPEAT); pshader->SetTextureUnits(msPTextureUnits); pshader->SetPrograms(msPPrograms); MaterialPass* pass = new0 MaterialPass(); pass->SetVertexShader(vshader); pass->SetPixelShader(pshader); pass->SetAlphaProperty(new0 AlphaProperty()); pass->SetCullProperty(new0 CullProperty()); pass->SetDepthProperty(new0 DepthProperty()); pass->SetOffsetProperty(new0 OffsetProperty()); pass->SetStencilProperty(new0 StencilProperty()); pass->SetWireProperty(new0 WireProperty()); MaterialTechnique* technique = new0 MaterialTechnique(); technique->InsertPass(pass); InsertTechnique(technique); }
//---------------------------------------------------------------------------- void JunglerMaterial::PostLink () { Material::PostLink(); MaterialPass* pass = mTechniques[0]->GetPass(0); VertexShader* vshader = pass->GetVertexShader(); PixelShader* pshader = pass->GetPixelShader(); vshader->SetBaseRegisters(msVRegisters); vshader->SetPrograms(msVPrograms); pshader->SetTextureUnits(msPTextureUnits); pshader->SetPrograms(msPPrograms); }
//---------------------------------------------------------------------------- UIMaterial::UIMaterial () { VertexShader* vshader = new0 VertexShader("PX2.UI", 3, 3, 1, 0, false); vshader->SetInput(0, "modelPosition", Shader::VT_FLOAT3, Shader::VS_POSITION); vshader->SetInput(1, "modelColor0", Shader::VT_FLOAT4, Shader::VS_COLOR0); vshader->SetInput(2, "modelTCoord0", Shader::VT_FLOAT2, Shader::VS_TEXCOORD0); vshader->SetOutput(0, "clipPosition", Shader::VT_FLOAT4, Shader::VS_POSITION); vshader->SetOutput(1, "vertexColor0", Shader::VT_FLOAT4, Shader::VS_COLOR0); vshader->SetOutput(2, "vertexTCoord0", Shader::VT_FLOAT2, Shader::VS_TEXCOORD0); vshader->SetConstant(0, "gPVWMatrix", 4); vshader->SetBaseRegisters(msVRegisters); vshader->SetPrograms(msVPrograms); PixelShader* pshader = new0 PixelShader("PX2.UI", 2, 1, 0, 1, false); pshader->SetInput(0, "vertexColor0", Shader::VT_FLOAT4, Shader::VS_COLOR0); pshader->SetInput(1, "vertexTCoord0", Shader::VT_FLOAT2, Shader::VS_TEXCOORD0); pshader->SetOutput(0, "pixelColor", Shader::VT_FLOAT4, Shader::VS_COLOR0); pshader->SetSampler(0, "gDiffuseSampler", Shader::ST_2D); pshader->SetFilter(0, Shader::SF_NEAREST); pshader->SetCoordinate(0, 0, Shader::SC_CLAMP_EDGE); pshader->SetCoordinate(0, 1, Shader::SC_CLAMP_EDGE); pshader->SetTextureUnits(msPTextureUnits); pshader->SetPrograms(msPPrograms); MaterialPass* pass = new0 MaterialPass(); pass->SetVertexShader(vshader); pass->SetPixelShader(pshader); pass->SetAlphaProperty(new0 AlphaProperty()); pass->SetCullProperty(new0 CullProperty()); pass->SetDepthProperty(new0 DepthProperty()); pass->SetOffsetProperty(new0 OffsetProperty()); pass->SetStencilProperty(new0 StencilProperty()); pass->SetWireProperty(new0 WireProperty()); pass->GetAlphaProperty()->BlendEnabled = true; MaterialTechnique* technique = new0 MaterialTechnique(); technique->InsertPass(pass); InsertTechnique(technique); }
//---------------------------------------------------------------------------- void StandardESMaterial_AlphaTest::PostLink () { Material::PostLink(); MaterialPass* pass = mTechniques[0]->GetPass(0); VertexShader* vshader = pass->GetVertexShader(); PixelShader* pshader = pass->GetPixelShader(); vshader->SetBaseRegisters(msVRegisters); vshader->SetPrograms(msVPrograms); pshader->SetTextureUnits(msPTextureUnits); pshader->SetPrograms(msPPrograms); vshader->SetShaderKey(SKT_STANNDES_ALPHATEST); pshader->SetShaderKey(SKT_STANNDES_ALPHATEST); }
//---------------------------------------------------------------------------- Texture2DMaterial::Texture2DMaterial (Shader::SamplerFilter filter, Shader::SamplerCoordinate coordinate0, Shader::SamplerCoordinate coordinate1) { VertexShader* vshader = new0 VertexShader("PX2.Texture2D", 2, 2, 1, 0, false); vshader->SetInput(0, "modelPosition", Shader::VT_FLOAT3, Shader::VS_POSITION); vshader->SetInput(1, "modelTCoord0", Shader::VT_FLOAT2, Shader::VS_TEXCOORD0); vshader->SetOutput(0, "clipPosition", Shader::VT_FLOAT4, Shader::VS_POSITION); vshader->SetOutput(1, "vertexTCoord0", Shader::VT_FLOAT2, Shader::VS_TEXCOORD0); vshader->SetConstant(0, "gPVWMatrix", 4); vshader->SetBaseRegisters(msVRegisters); vshader->SetPrograms(msVPrograms); PixelShader* pshader = new0 PixelShader("PX2.Texture2D", 1, 1, 0, 1, false); pshader->SetInput(0, "vertexTCoord0", Shader::VT_FLOAT2, Shader::VS_TEXCOORD0); pshader->SetOutput(0, "pixelColor", Shader::VT_FLOAT4, Shader::VS_COLOR0); pshader->SetSampler(0, "gDiffuseSampler", Shader::ST_2D); pshader->SetFilter(0, filter); pshader->SetCoordinate(0, 0, coordinate0); pshader->SetCoordinate(0, 1, coordinate1); pshader->SetTextureUnits(msPTextureUnits); pshader->SetPrograms(msPPrograms); MaterialPass* pass = new0 MaterialPass(); pass->SetVertexShader(vshader); pass->SetPixelShader(pshader); pass->SetAlphaProperty(new0 AlphaProperty()); pass->SetCullProperty(new0 CullProperty()); pass->SetDepthProperty(new0 DepthProperty()); pass->SetOffsetProperty(new0 OffsetProperty()); pass->SetStencilProperty(new0 StencilProperty()); pass->SetWireProperty(new0 WireProperty()); MaterialTechnique* technique = new0 MaterialTechnique(); technique->InsertPass(pass); InsertTechnique(technique); }
//---------------------------------------------------------------------------- void ImageProcessing::CreateMaterial (PixelShader* pshader, Material*& material, MaterialInstance*& instance) { // 创建pass MaterialPass* pass = new0 MaterialPass(); pass->SetPixelShader(pshader); // 所有材质都共享相同的顶点着色器 pass->SetVertexShader(mVertexShader); // 创建渲染状态 pass->SetAlphaProperty(new0 AlphaProperty()); pass->SetOffsetProperty(new0 OffsetProperty()); pass->SetStencilProperty(new0 StencilProperty()); pass->SetWireProperty(new0 WireProperty()); // 不裁剪三角形 CullProperty* cproperty = new0 CullProperty(); cproperty->Enabled = false; pass->SetCullProperty(cproperty); // 不需要深度缓冲区 DepthProperty* dproperty = new0 DepthProperty(); dproperty->Enabled = false; dproperty->Writable = false; pass->SetDepthProperty(dproperty); // 创建Technique MaterialTechnique* technique = new0 MaterialTechnique(); technique->InsertPass(pass); material = new0 Material(); material->InsertTechnique(technique); // Create the material instance and set the vertex shader constants. // 创建材质实例 instance = new0 MaterialInstance(material, 0); // 顶点着色器变换 instance->SetVertexConstant(0, "PVWMatrix", mPVWMatrixConstant); }
//---------------------------------------------------------------------------- StandardESMaterial_AlphaTest::StandardESMaterial_AlphaTest () { VertexShader* vshader = new0 VertexShader("PX2.StandardESMaterial_AlphaTest", 3, 3, 7, 0, false); vshader->SetInput(0, "modelPosition", Shader::VT_FLOAT3, Shader::VS_POSITION); vshader->SetInput(1, "modelNormal", Shader::VT_FLOAT3, Shader::VS_NORMAL); vshader->SetInput(2, "modelTCoord0", Shader::VT_FLOAT2, Shader::VS_TEXCOORD0); vshader->SetOutput(0, "clipPosition", Shader::VT_FLOAT4, Shader::VS_POSITION); vshader->SetOutput(1, "vertexTCoord0", Shader::VT_FLOAT2, Shader::VS_TEXCOORD0); vshader->SetOutput(2, "vertexTCoord1", Shader::VT_FLOAT4, Shader::VS_TEXCOORD1); vshader->SetConstant(0, "gPVWMatrix", 4); vshader->SetConstant(1, "gShineEmissive", 1); vshader->SetConstant(2, "gShineAmbient", 1); vshader->SetConstant(3, "gShineDiffuse", 1); vshader->SetConstant(4, "gLightAmbient", 1); vshader->SetConstant(5, "gLightDiffuse", 1); vshader->SetConstant(6, "gLightModelDirection", 1); vshader->SetBaseRegisters(msVRegisters); vshader->SetPrograms(msVPrograms); PixelShader* pshader = new0 PixelShader("PX2.StandardESMaterial_AlphaTest", 2, 1, 0, 1, false); pshader->SetInput(0, "vertexTCoord0", Shader::VT_FLOAT2, Shader::VS_TEXCOORD0); pshader->SetInput(1, "vertexTCoord1", Shader::VT_FLOAT4, Shader::VS_TEXCOORD1); pshader->SetOutput(0, "pixelColor", Shader::VT_FLOAT4, Shader::VS_COLOR0); pshader->SetSampler(0, "gDiffuseSampler", Shader::ST_2D); pshader->SetFilter(0, Shader::SF_LINEAR); pshader->SetCoordinate(0, 0, Shader::SC_CLAMP); pshader->SetCoordinate(0, 1, Shader::SC_CLAMP); pshader->SetTextureUnits(msPTextureUnits); pshader->SetPrograms(msPPrograms); vshader->SetShaderKey(SKT_STANNDES_ALPHATEST); pshader->SetShaderKey(SKT_STANNDES_ALPHATEST); MaterialPass* pass = new0 MaterialPass(); pass->SetVertexShader(vshader); pass->SetPixelShader(pshader); pass->SetAlphaProperty(new0 AlphaProperty()); pass->SetCullProperty(new0 CullProperty()); pass->SetDepthProperty(new0 DepthProperty()); pass->SetOffsetProperty(new0 OffsetProperty()); pass->SetStencilProperty(new0 StencilProperty()); pass->SetWireProperty(new0 WireProperty()); pass->GetAlphaProperty()->CompareEnabled = true; pass->GetAlphaProperty()->Compare = PX2::AlphaProperty::CM_GREATER; pass->GetAlphaProperty()->Reference = 0.25f; MaterialTechnique* technique = new0 MaterialTechnique(); technique->InsertPass(pass); InsertTechnique(technique); }
//----------------------------------------------------------------------------- void ProjTreeItem::SetTreeLevel(ProjTreeLevel level, bool isShowHelpNode) { mTreeLevel = level; mIsShowHelpNode = isShowHelpNode; Project *proj = DynamicCast<Project>(mObject); Scene *scene = DynamicCast<Scene>(mObject); if (proj || scene) return; Actor *actor = DynamicCast<Actor>(mObject); Movable *mov = DynamicCast<Movable>(mObject); Node *node = DynamicCast<Node>(mObject); Renderable *renderable = DynamicCast<Renderable>(mObject); EffectableController *effectableCtrl = DynamicCast<EffectableController>(mObject); Material *mtl = DynamicCast<Material>(mObject); MaterialTechnique *mtlTechnique = DynamicCast<MaterialTechnique>(mObject); MaterialPass *mtlPass = DynamicCast<MaterialPass>(mObject); if (!mObject) { // IT_CATALOG for (int i = 0; i < (int)mChildItems.size(); i++) { ProjTreeItem *item = mChildItems[i]; if (item) item->SetTreeLevel(level, isShowHelpNode); } return; } else { ClearChildren(); } bool addCtrl = false; bool addModule = false; bool addNode = false; bool addMaterial = false; if (PTL_GENERAL == mTreeLevel) { } else if (PTL_CHILDREN == mTreeLevel) { if (!scene && !proj && node) { addNode = true; } } else if (PTL_CONTROLS == mTreeLevel) { if (!scene && !proj && mov) { addCtrl = true; } if (!scene && !proj && node) { addNode = true; } if (effectableCtrl) { addModule = true; } } else if (PTL_MATERIALS == mTreeLevel) { if (!scene && !proj && mov) { addCtrl = true; } if (!scene && !proj && node) { addNode = true; } if (renderable) { addMaterial = true; } } else if (PTL_DETAIL == mTreeLevel) { if (!scene && !proj && mov) { addCtrl = true; } if (!scene && !proj && node) { addNode = true; } if (renderable) { addMaterial = true; } } if (addCtrl) { int numCtrls = mov->GetNumControllers(); for (int i = 0; i < numCtrls; i++) { Controller *ctrl = mov->GetController(i); AddChild(ctrl, mIconID, mTreeLevel, mIsShowHelpNode); } } if (addMaterial) { MaterialInstance *mtlInst = renderable->GetMaterialInstance(); Material *mtl = mtlInst->GetMaterial(); AddChild(mtl, mIconID, mTreeLevel, mIsShowHelpNode); } if (mtl) { int numTechniques = mtl->GetNumTechniques(); for (int i = 0; i < numTechniques; i++) { MaterialTechnique *mtlTechnique = mtl->GetTechnique(i); AddChild(mtlTechnique, mIconID, mTreeLevel, isShowHelpNode); } } if (mtlTechnique) { int numPasses = mtlTechnique->GetNumPasses(); for (int i = 0; i < numPasses; i++) { MaterialPass *mtlPass = mtlTechnique->GetPass(i); AddChild(mtlPass, mIconID, mTreeLevel, isShowHelpNode); } } if (mtlPass) { AddChild(mtlPass->GetVertexShader(), mIconID, mTreeLevel, isShowHelpNode); AddChild(mtlPass->GetPixelShader(), mIconID, mTreeLevel, isShowHelpNode); AddChild(mtlPass->GetAlphaProperty(), mIconID, mTreeLevel, isShowHelpNode); AddChild(mtlPass->GetCullProperty(), mIconID, mTreeLevel, isShowHelpNode); AddChild(mtlPass->GetDepthProperty(), mIconID, mTreeLevel, isShowHelpNode); AddChild(mtlPass->GetOffsetProperty(), mIconID, mTreeLevel, isShowHelpNode); AddChild(mtlPass->GetStencilProperty(), mIconID, mTreeLevel, isShowHelpNode); AddChild(mtlPass->GetWireProperty(), mIconID, mTreeLevel, isShowHelpNode); } if (addModule) { int numModules = effectableCtrl->GetNumModules(); for (int i = 0; i < numModules; i++) { EffectModule *module = effectableCtrl->GetModule(i); AddChild(module, mIconID, mTreeLevel, mIsShowHelpNode); } } if (addNode) { int numChildren = node->GetNumChildren(); for (int i = 0; i < numChildren; i++) { Movable *child = node->GetChild(i); if (child) { bool ingore = false; if (!isShowHelpNode && ("HelpNode" == child->GetName())) ingore = true; if (!ingore) { AddChild(child, mIconID, mTreeLevel, mIsShowHelpNode); } } } } }