◎BasicEffectをカスタムエフェクトに差し替える改修 (下記コードをLoadContent()の末尾に追加し、Phong.fxにセマンティクスを追加する) // BasicEffectをカスタムエフェクトに差し替える改修 Effect orgEffect = content.Load("Content/Effects/Phong"); //Effect orgEffect = content.Load("Content/Effects/Lambert"); Texture2D albedoMap = content.Load("Content/Textures/default_surface_map"); Texture2D ambientMap = content.Load("Content/Textures/default_ambocc_map"); Texture2D normalMap = content.Load("Content/Textures/default_normal_map"); foreach (ModelAsset m in Models) { foreach (ModelMesh mesh in m.CrosswalkModel.Meshes) { foreach (ModelMeshPart part in mesh.MeshParts) { if (part.Effect.GetType() == typeof(BasicEffect)) { // エフェクトのクローンを作成する Effect myEffect = orgEffect.Clone(graphics.GraphicsDevice); // エフェクトパラメータの引き継ぎ foreach (EffectParameter parameter in part.Effect.Parameters) { if (parameter.Name == "BasicTexture") { Texture2D texture = parameter.GetValueTexture2D(); if (texture == null) texture = albedoMap; myEffect.Parameters["AlbedoMap"].SetValue(texture); myEffect.Parameters["AmbientMap"].SetValue(ambientMap); myEffect.Parameters["NormalMap"].SetValue(normalMap); } if (parameter.Name == "AmbientLightColor") myEffect.Parameters["AmbientColor"].SetValue(parameter.GetValueVector3()); if (parameter.Name == "DiffuseColor") myEffect.Parameters["DiffuseColor"].SetValue(parameter.GetValueVector3()); if (parameter.Name == "SpecularColor") // HLSL側にグローバル変数が存在するかチェックし、OKの場合セットする(HLSL側にセマンティクス必須) if (myEffect.Parameters.GetParameterBySemantic("SpecularColor") != null) myEffect.Parameters["SpecularColor"].SetValue(parameter.GetValueVector3()); if (parameter.Name == "SpecularPower") // HLSL側にグローバル変数が存在するかチェックし、OKの場合セットする(HLSL側にセマンティクス必須) if (myEffect.Parameters.GetParameterBySemantic("SpecularPower") != null) myEffect.Parameters["SpecularPower"].SetValue(parameter.GetValueSingle()); if (parameter.Name == "World") myEffect.Parameters["Model"].SetValue(parameter.GetValueMatrix()); if (parameter.Name == "View") myEffect.Parameters["View"].SetValue(parameter.GetValueMatrix()); if (parameter.Name == "Projection") myEffect.Parameters["Projection"].SetValue(parameter.GetValueMatrix()); } // エフェクトを差し替える part.Effect = myEffect; } } } }