Xna内容管道和纹理

本文关键字:纹理 管道 Xna | 更新日期: 2023-09-27 18:20:18

我试着了解内容处理器和纹理,但我有点困惑。。。我有两个场景:

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

  • 第二个场景是,我想利用纹理处理器从纹理文件创建一个精灵贴图对象,精灵贴图基本上是一个包含纹理和精灵宽度/高度的模型。

让我一直困惑的是这些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");

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

Xna内容管道和纹理

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

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

我写的这篇类似的帖子让我更清楚地知道我哪里出了问题,以及我需要做些什么来解决这个问题。

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

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

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