2012-01-15 1 views
0

я пытался получить мою голову вокруг процессора контента и текстур, но я немного запуталась ... У меня есть 2 сценария:XNA Content Pipeline и текстуры

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

  • Второй сценарий - я хочу, чтобы конгруэнция текстурного процессора создавала объект 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, похоже, волшебным образом превращается в Texture, когда он загружается через ContentManager ... поэтому я m немного озадачен тем, как я могу получить текстуру в этом случае. Поскольку оба сценария достаточно похожи, я уверен, если я решаю один я буду решать их обоих, но в идеале я хочу, чтобы быть в состоянии пойти:

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

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

ответ

1

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

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

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

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

0

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

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

+0

Я не думаю, что это на самом деле отвечает на вопрос, вы просто говорите мне, что конвейер содержимого делает на высоком уровне ... Я знаю, что он делает, и я видел пример вы говорите , но то, что меня больше смутило, это используемые TextureContent и ExternalReferences. ОДНАКО, что, как я сказал, я сделал аналогичную запись на несколько другой теме на одном из других сайтов stackexchange, которые ответили на этот вопрос круглым путем, поэтому свяжут это здесь. – Grofit