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

2006 - 2024,推荐分辨率 1024*768 以上,推荐浏览器 Chrome、Edge 等现代浏览器,截止 2021 年 12 月 5 日的访问次数:1872 万 9823 站长邮箱

沪 ICP 备 18037240 号-1

沪公网安备 31011002002865 号