0

コンテンツプロセッサとテクスチャに頭を悩ませようとしましたが、少し混乱しています...2つのシナリオがあります。

  • 1つはテクスチャを含むモデルで、インポーターは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が与えられていると文句を言いますが、それはテクスチャではありません...しかし、何らかの理由で、contentManagerを介してロードされると、TextureContentが魔法のようにTextureに変わるようです...この場合、どのようにテクスチャを取得できるかについて。どちらのシナリオもかなり似ているので、どちらかを解決すれば両方を解決できると確信していますが、理想的には次のようになりたいと思います。

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

この一見魔法のようなプロセスを機能させる方法を誰かが説明できれば、私はあなたに多くの賞賛を与えます!

4

2 に答える 2

1

ここでの私の主な問題は、両側で同じモデルを使用しようとしていたことです。テクスチャ コンテンツは、現在の理解からのテクスチャのコンパイル時の表現です。そのため、インポーター/プロセッサーのコンパイル時のドメインにいるときは、これらの参照とコンテンツ データのみを操作できます。

したがって、私の問題を解決するには、Texture2D ではなく TextureContent を使用するように戻し、問題のテクスチャへの参照とモデルに必要なその他のデータを含むモデル SpriteMapContent を作成する必要がありました。次に、コンテンツ リーダー/ライターを記述して、ランタイム ドメインでデータがどのようにまとめられるかを制御します。

私が作成したこの同様の投稿により、どこで問題が発生し、問題を解決するために何をする必要があるかが明確になりました.

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

于 2012-01-16T15:35:01.517 に答える
0

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

やりたいことの良い例は、XNA の Normal Map サンプルです。法線マップは、実際にハイポリ モデルを持たなくても、モデルの各テクセルの角度を定義します。この例では、テクスチャを指定できます。次に、テクスチャを処理してモデルにアタッチし、後で実行時に取得できるようにします。Opaque Data リストに保存し、シェーダー変数としてアタッチします。

于 2012-01-16T15:17:29.177 に答える