Xna Content Pipeline и Текстуры - PullRequest
       27

Xna Content Pipeline и Текстуры

0 голосов
/ 16 января 2012

Я пытался разобраться с процессором контента и текстурами, но я немного запутался ... У меня есть 2 сценария:

  • Один - это модель, которая содержитTexture, импортер загружает XML и передает имя файла текстуры в процессор, но я могу получить только TextureContent, который кажется ссылкой на текстуру во время компиляции, но это не помогает мне заполнить бит Texture2D моей модели.

  • 2-й сценарий: я хочу использовать текстурный процессор для создания объекта spritemap из файла текстуры, spritemap в основном представляет собой модель, которая содержит текстуру и ширину / высоту спрайта.

То, что меня постоянно ставит в тупик, это то, что 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");

Если кто-нибудь может объяснить, как заставить этот, казалось бы, волшебный процесс работатьЯ дам вам много похвал!

Ответы [ 2 ]

1 голос
/ 16 января 2012

Моя главная проблема заключалась в том, что я пытался использовать одну и ту же модель с обеих сторон, содержание текстуры - это представление текстуры во время компиляции из моего текущего понимания. Поэтому, когда я нахожусь в области времени компиляции Importer / Processor, я могу работать только с этими ссылками и данными контента.

Таким образом, чтобы решить мою проблему, мне пришлось вернуться к использованию TextureContent, а не Texture2D, а затем создать модель SpriteMapContent, которая содержала бы ссылки на рассматриваемые текстуры и другие данные, необходимые для модели. Затем напишите средство чтения / записи контента, чтобы управлять тем, как данные были собраны во время выполнения.

Этот похожий пост, который я сделал, прояснил мне, где я ошибался и что мне нужно было сделать, чтобы решить проблему.

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

0 голосов
/ 16 января 2012

Основная концепция контент-процессора состоит в том, чтобы упаковать ваши активы в промежуточное состояние.XNB - это то, что он обычно создает.Это двоичный файл, который можно быстро загрузить во время выполнения.Если у вас есть текстура, ее можно прочитать, удалить альфу, сжать в формат DirectX, а затем сохранить в виде двоичного файла, который будет загружен во время выполнения.Ваша основная цель состоит в том, чтобы подготовить TextureContent таким, каким вы хотите, а затем позволить базовым классам процессора содержимого упаковать его в двоичный формат.

Отличным примером того, что вы хотите сделать, является пример карты нормалей наXNA.Карта нормалей определяет угол каждого текселя на модели, фактически не имея высокополигональной модели.В этом примере вы можете указать текстуру, затем обработать текстуру и прикрепить ее к модели, чтобы вы могли получить ее позже во время выполнения.Он сохраняет его в списке непрозрачных данных, а также присоединяет его как переменную шейдера.

...