はい、あなたはこれを行うことができます。カスタム頂点フォーマットを定義するだけで、XNAが残りの作業を行います。
覚えておくべき最も重要なことは、利用可能なVertexElementFormats(MSDNHalfVector )の要素の使用に制限されていることです-フォーマットはReachプロファイル(info )では利用できないことに注意してください。
Microsoft.Xna.Framework.Graphics.PackedVectorXNAは、 (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一致します。したがって、このカスタム形式では、とがあります。POSITION0TEXCOORD0
代わりにコンストラクターに直接IVertexType渡すこともできるため、の使用はオプションです。VertexDeclarationVertexBuffer
私が提供したものとは異なる頂点フォーマットを作成したい場合は、これですべての情報が必要になります。詳細については、APIの詳細を説明するShawnHargreavesによるブログ投稿があります。