はい、あなたはこれを行うことができます。カスタム頂点フォーマットを定義するだけで、XNAが残りの作業を行います。
覚えておくべき最も重要なことは、利用可能なVertexElementFormat
s(MSDNHalfVector
)の要素の使用に制限されていることです-フォーマットはReach
プロファイル(info )では利用できないことに注意してください。
Microsoft.Xna.Framework.Graphics.PackedVector
XNAは、 (MSDN)またはメインライブラリで使用可能なすべての形式の実装をすでに提供しているため、独自のベクトル型を作成する必要はおそらくありません。独自のタイプを作成する場合はstruct
、同じようにパックする(または頂点のルーズフィールド)必要があります。
int
最後に、32ビットのデータ型がないことを指摘する価値があります。float
また、 (a Single
)は32ビットで同じサイズであるため、メリットもありません。(また、一部のGPUは単精度で動作するため、とにかく余分な精度を維持することはできません。)
したがってVertexPositionTexture
、Vector3
位置(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; }
}
}
カスタム頂点タイプを作成するときに重要なことは、フィールドがVertexDeclaration
(MSDN)で指定した順序とレイアウトに一致することを確認することです。作成方法は一目瞭然です。のコンストラクタVertexDeclaration
については、MSDNページをご覧くださいVertexElement
。各フィールドのオフセットはバイト単位で指定されます。
およびは、HLSLの頂点シェーダーセマンティクスelementUsage
にusageIndex
一致します。したがって、このカスタム形式では、とがあります。POSITION0
TEXCOORD0
代わりにコンストラクターに直接IVertexType
渡すこともできるため、の使用はオプションです。VertexDeclaration
VertexBuffer
私が提供したものとは異なる頂点フォーマットを作成したい場合は、これですべての情報が必要になります。詳細については、APIの詳細を説明するShawnHargreavesによるブログ投稿があります。