1

私は現在、VertexPositionTexturesを使用して膨大な量の頂点データを設定するプロジェクトに取り組んでいます。これは多くのメモリを消費することになります。現在メモリにあるものとハードドライブにオフロードできるものに関しては、ある程度の最適化を行うことができますが、可能な限りあらゆる方法で最適化したいと思います。

私の質問:VertexPositionTexture構造体を書き直して、カスタムIntVectorクラスを使用して使用するスペースを減らす方法はありますか?これには、DrawPrimitivesとDrawUserPrimitivesにも変更が必要ですか?

テクスチャアトラスを使用していないので、これを尋ねます。したがって、UV座標は常に(0,0)、(0,1)、(1,0)、(1,1)であり、フロートなしで表すことができます。私の頂点の位置も整数で簡単に表すことができます。

4

1 に答える 1

4

はい、あなたはこれを行うことができます。カスタム頂点フォーマットを定義するだけで、XNAが残りの作業を行います。

覚えておくべき最も重要なことは、利用可能なVertexElementFormats(MSDNHalfVector )の要素の使用に制限されていることです-フォーマットはReachプロファイル(info )では利用できないことに注意してください。

Microsoft.Xna.Framework.Graphics.PackedVectorXNAは、 (MSDN)またはメインライブラリで使用可能なすべての形式の実装をすでに提供しているため、独自のベクトル型を作成する必要はおそらくありません。独自のタイプを作成する場合はstruct、同じようにパックする(または頂点のルーズフィールド)必要があります。

int最後に、32ビットのデータ型がないことを指摘する価値があります。floatまた、 (a Single)は32ビットで同じサイズであるため、メリットもありません。(また、一部のGPUは単精度で動作するため、とにかく余分な精度を維持することはできません。)


したがってVertexPositionTextureVector3位置(96ビット)とVector2テクスチャ座標(64ビット)を含む合計160ビットから始めます。

IntVertexPositionTextureこれを、Short4位置(64ビット)とNormalizedShort2テクスチャ座標(32ビット)を含む合計96ビット(40%のサイズ縮小)のカスタムに変換してみましょう。

(2Dで作業している場合は、Short2代わりに使用しShort4て、さらに32ビットを節約できます。ありませんShort3。)

この頂点タイプのコードは次のとおりです。これは、APIが何を期待しているかを知っている場合にすぎません。

struct IntVertexPositionTexture : IVertexType
{
    public Short4 Position;
    public NormalizedShort2 TextureCoordinate;

    public IntVertexPositionTexture(Short4 position, NormalizedShort2 textureCoordinate)
    {
        this.Position = position;
        this.TextureCoordinate = textureCoordinate;
    }

    public static readonly VertexDeclaration VertexDeclaration = new VertexDeclaration(new VertexElement[]
    {
        new VertexElement(0, VertexElementFormat.Short4, VertexElementUsage.Position, 0),
        new VertexElement(8, VertexElementFormat.NormalizedShort2, VertexElementUsage.TextureCoordinate, 0),
    });

    VertexDeclaration IVertexType.VertexDeclaration
    {
        get { return IntVertexPositionTexture.VertexDeclaration; }
    }
}

カスタム頂点タイプを作成するときに重要なことは、フィールドがVertexDeclarationMSDN)で指定した順序とレイアウトに一致することを確認することです。作成方法は一目瞭然です。のコンストラクタVertexDeclarationについては、MSDNページをご覧くださいVertexElement。各フィールドのオフセットはバイト単位で指定されます。

およびは、HLSLの頂点シェーダーセマンティクスelementUsageusageIndex一致します。したがって、このカスタム形式では、とがあります。POSITION0TEXCOORD0

代わりにコンストラクターに直接IVertexType渡すこともできるため、の使用はオプションです。VertexDeclarationVertexBuffer


私が提供したものとは異なる頂点フォーマットを作成したい場合は、これですべての情報が必要になります。詳細については、APIの詳細を説明するShawnHargreavesによるブログ投稿があります。

于 2012-08-30T08:22:36.177 に答える