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 阅读次数:4710