2012-01-15 82 views
0

我已經盡力讓我周圍的內容處理器和紋理的頭,但我有點困惑...我有2種情況:XNA內容管道和紋理

  • 一個是包含一個模型紋理,導入器加載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,但這不是一個紋理...但由於某種原因,TextureContent在通過contentManager加載時似乎神奇地變成了一個Texture ...所以我a對於我在這種情況下如何獲得紋理有點困惑。由於這兩種方案都非常相似,我相信,如果我解決了一個,我會解決他們兩個,但理想的我希望能夠去:

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

如果任何人都可以解釋如何使這個看似神奇的過程中工作,我會給你很多讚譽!

回答

1

這裏我的主要問題是,我試圖在兩邊都使用相同的模型,紋理內容是我當前理解的紋理的編譯時表示。因此,當我處於導入器/處理器的編譯時域時,我只能使用這些引用和內容數據。

因此,爲了解決我的問題,我不得不恢復使用TextureContent而不是Texture2D,然後創建一個模型SpriteMapContent,其中包含對所涉及紋理的引用以及模型所需的其他數據。然後編寫一個內容讀取器/寫入器來管理數據在運行時域中的組合方式。

我做的這篇類似的文章讓我更清楚自己在哪裏出錯,需要做些什麼來解決問題。

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

0

內容處理器的基本概念是將資產打包到中間狀態。 XNB是它通常創造的。它是一個可以快速加載到運行時的二進制文件。如果你有一個紋理,它可以被讀入,除去alpha,壓縮成directx格式,然後保存爲一個二進制文件,它將在運行時加載。您的基本目標是將TextureContent準備爲您想要的方式,然後讓內容處理器基類將其打包爲二進制格式。

你想要做的一個很好的例子就是XNA上的Normal Map示例。法線貼圖定義了模型上每個紋理元素的角度,但實際上沒有使用hi-poly模型。該示例讓您指定紋理,然後處理紋理並將其附加到模型中,以便稍後在運行時獲取它。它將其存儲在不透明數據列表中,並將其作爲着色器變量附加。

+0

我不認爲這實際上回答了這個問題,你只是告訴我內容管道確實在較高的水平什麼...我知道它做什麼,我已經看到你所談論的例子,但最讓我困惑的是正在使用的TextureContent和ExternalReferences。但是,據說我在其他一個stackexchange站點上稍微不同的主題上做了類似的帖子,這個站點在一個回合的方式回答了這個問題,所以會在這裏鏈接。 – Grofit 2012-01-16 15:31:37