11.4.6 改变网格Effect
你需要使用在前面一节创建的effect绘制模型。XNA的模型处理器包含ConvertMaterial 方法,只要找到模型网格的材质这个方法就会被调用。
ConvertMaterial方法将一个包含材质的MaterialContent 对象作为参数。当一个模型导出不包含effect时,它只拥有一些基本的材质配置,例如颜色和纹理。在这个例子中,接受的MaterialContent 实际上是一个BasicMaterialContent类的实例。如果模型导出时已经包含effect,那么MaterialContent是EffectMaterialContent 类的实例。
要改变模型使用的材质,你需要重写ConvertMaterial方法,将接受BasicMaterialContent改为接受EffectMaterialContent,而EffectMaterialContent中包含对应动画模型的effect。下面是ConvertMaterial方法的代码,这个代码应添加到模型处理器类中:
protected override MaterialContent ConvertMaterial(MaterialContent material, ContentProcessorContext context)
{
BasicMaterialContent basicMaterial = material as BasicMaterialContent;
if (basicMaterial == null)
context.Logger.LogImportantMessage("This mesh doesn't have a valid basic material.");
// Only process meshes with basic material
// Otherwise the mesh must use the correct effect (AnimatedModel.fx)
if (basicMaterial != null)
{
EffectMaterialContent effectMaterial =new EffectMaterialContent();
effectMaterial.Effect =new ExternalReference<EffectContent>( SHADERS_PATH + SHADER_FILENAME);
// Correct the texture path
if (basicMaterial.Texture != null)
{
string textureFileName = Path.GetFileName( basicMaterial.Texture.Filename);
effectMaterial.Textures.Add("diffuseTexture1", new ExternalReference<TextureContent>
( TEXTURES_PATH + textureFileName));
}
return base.ConvertMaterial(effectMaterial, context);
}
else
return base.ConvertMaterial(material, context);
}
当BasicMaterialContent转换到EffectMaterialContent时,模型纹理使用的默认材质会使用新创建的effect。
发布时间:2009/5/13 上午8:41:43 阅读次数:5281
