Xna内容管道和纹理

时间:2012-01-15 23:15:46

标签: c# xna textures content-pipeline

我试图了解内容处理器和纹理,但我有点困惑......我有两种情况:

  • 一个是包含纹理的模型,导入器加载xml并将纹理文件名传递给处理器,但我只能得到一个TextureContent,它似乎是对纹理的编译时引用,但是这对我填充模型的Texture2D位没有帮助。

  • 第二种情况是我想背负纹理处理器从纹理文件创建一个spritemap对象,spritemap基本上是一个包含纹理和sprite宽度/高度的模型。

让我难以接受的是这些ExternalReference和TextureContent,正如模型一样,让我们​​说:

public class SpriteMap
{
    public Texture2D Texture { get; private set; }
    public int SpriteWidth { get; private set; }
    public int SpriteHeight { get; private set; }

    public SpriteMap(Texture2D texture, int spriteWidth, int spriteHeight)
    {
        this.texture = texture;
        this.spriteWidth = spriteWidth;
        this.spriteHeight = spriteHeight;
    }
}

然后我有一个像这样的内容处理器:

[ContentProcessor(DisplayName = "TextureToSpriteMapProcessor")]
public class TextureToSpriteMapProcessor : ContentProcessor<Texture2D, ISpriteMap>
{
    [DisplayName("Sprite Width")]
    [DefaultValue(64)]
    [Description("The size of each sprite's width within the sprite map.")]
    public virtual int SpriteWidth { get; set; }

    [DisplayName("Sprite Height")]
    [DefaultValue(64)]
    [Description("The size of each sprite's height within the sprite map.")]
    public virtual int SpriteHeight { get; set; }

    public override ISpriteMap Process(Texture2D input, ContentProcessorContext context)
    { return new SpriteMap(input, SpriteWidth, SpriteHeight); }
}

现在它抱怨处理器有一个TextureContent,但这不是纹理...但由于某种原因,当通过contentManager加载时,TextureContent似乎神奇地变成了纹理...所以我是关于如何在这个实例中获得纹理有点困惑。由于这两种情况非常相似,我相信如果我解决了这两种问题,我会解决它们,但理想情况下我希望能够解决这些问题:

contentManager.Load<ISpriteMap>("someTextureAsset");

如果有人能解释如何使这个看似神奇的过程发挥作用,我会给你很多赞美!

2 个答案:

答案 0 :(得分:1)

我的主要问题是我试图在两侧使用相同的模型,纹理内容是我当前理解的纹理的编译时表示。因此,当我进入Importer / Processor的编译时域时,我只能处理这些引用和内容数据。

因此,为了解决我的问题,我不得不恢复使用TextureContent而不是Texture2D,然后创建一个模型SpriteMapContent,其中包含对相关纹理的引用以及模型所需的其他数据。然后编写一个内容读取器/写入器来管理数据在运行时域中的组合方式。

我发这篇类似的文章让我更清楚地知道我哪里出错了以及我需要做些什么才能解决这个问题。

https://gamedev.stackexchange.com/questions/22480/contentserializerruntimetype-required-in-content-pipeline/22482#22482

答案 1 :(得分:0)

内容处理器的基本概念是将资产打包到中间状态。 XNB就是它通常创造的东西。它是一个二进制文件,可以快速加载到运行时。如果你有一个纹理,它可以被读入,删除alpha,压缩成directx格式,然后保存为二进制文件,它将在运行时加载。您的基本目标是使TextureContent准备好您想要的方式,然后让内容处理器基类将其打包成二进制格式。

您想要做的一个很好的例子是XNA上的法线贴图示例。法线贴图定义模型上每个纹素的角度,而不实际具有hi-poly模型。该示例允许您指定纹理,然后处理纹理并将其附加到模型,以便稍后在运行时获取它。它将它存储在不透明数据列表中,并将其作为着色器变量附加。