2012-01-15 14 views
0

私はコンテンツプロセッサとテクスチャのまわりで私の頭を取得しようとしましたが、私は少し混乱しています...私は2つのシナリオがあります。XNAコンテンツパイプラインとテクスチャ

  • 一つは、A含むモデルでありますテクスチャでは、インポータはxmlを読み込んでテクスチャファイル名をプロセッサに渡しますが、TextureContentを取得することはできますが、これはテクスチャへのコンパイル時の参照と思われますが、これは私のモデルのTexture2Dビット。

  • 第2のシナリオは、テクスチャファイルからスプライトマップオブジェクトを作成するためにテクスチャプロセッサをピギーバックしたいのですが、スプライトマップは基本的にテクスチャとスプライトの幅/高さを含むモデルです。私は困惑なっ保ち

事はこれら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に変わるようです。私はこのインスタンスでどのようにテクスチャを得ることができるのか、ちょっと困惑しています。私は、誰もがこの一見魔法のプロセスを機能させるためにどのように説明することができた場合

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

:私は1つを解決した場合、両方のシナリオは、私は確信しているかなり似ているように私はそれらの両方を解決しますが、理想的に私は行くことができるようにしたいですあなたに多くの賞賛を与えるでしょう!

答えて

1

ここで私の主な問題は、私が両側で同じモデルを使用しようとしていたことです。テクスチャの内容は、現在の理解からのテクスチャのコンパイル時の表現です。ですから、私がImporter/Processorのコンパイル時のドメインにいるとき、私はこれらの参照とコンテンツのデータだけを扱うことができます。

私の問題を解決するには、TextureContentを使用しTexture2Dを使用しないようにしてから、問題のテクスチャへの参照とモデルに必要なその他のデータを含むモデルSpriteMapContentを作成しなければなりません。次に、データがランタイムドメイン内でどのように組み合わされたかを管理するコンテンツリーダ/ライタを作成します。

私が作ったのと同様のこの記事は、私が間違っていたところ、そして私が問題を解決するために必要なことを私に明瞭にしたものでした。私はあなただけのコンテンツパイプラインがハイレベルで何をするか...私はそれが何を知っている、と私はあなたが話している例を見てきた私に言っている、これは実際に質問に答えると思ういけない

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

0

コンテンツプロセッサの基本概念は、資産を中間状態にパックすることです。 XNBは通常それが作成するものです。ランタイムに素早くロードできるバイナリファイルです。テクスチャがある場合は、読み込んだりアルファを削除したり、DirectX形式に圧縮したり、実行時に読み込まれるバイナリ形式で保存したりすることができます。あなたの基本的な目的は、TextureContentをどのようにしたいのかを準備して、コンテンツプロセッサがそれをバイナリ形式にパックすることを可能にすることです。

あなたがしたいことの素晴らしい例は、XNAのノーマルマップサンプルです。法線マップは、実際にハイポリモデルを持たないモデル上の各テクセルの角度を定義します。この例ではテクスチャを指定し、テクスチャを処理してモデルに添付して、実行時に後で取得できるようにします。それは、それを不透明データリストに格納し、それをシェーダー変数としてアタッチします。

+0

しかし、私を最も混乱させるのは、使用されているTextureContentとExternalReferencesです。しかし、私はこの質問に答えた他のスタック・エクスチェンジ・サイトのちょっと異なるテーマについて同様の投稿をしたと言われています。 – Grofit