0

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

  • 一个是包含纹理的模型,导入器加载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,但这不是纹理......但是由于某种原因,TextureContent在通过contentManager加载时似乎神奇地变成了纹理......所以我有点困惑至于我如何在这种情况下获得纹理。由于这两种情况都非常相似,我确信如果我解决了一个问题,我会同时解决它们,但理想情况下我希望能够:

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

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

4

2 回答 2

1

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

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

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

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

于 2012-01-16T15:35:01.517 回答
0

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

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

于 2012-01-16T15:17:29.177 回答