是的,你可以這樣做。你只需要定義一個自定義的頂點格式,XNA將完成剩下的工作。
要記住最重要的事情是,你只限於使用元素可用VertexElementFormat
S(MSDN) - 指出,HalfVector
格式不在Reach
輪廓(info)可用。
你也許並不需要創建自己的矢量類型,因爲XNA已經提供了實現所有可用的格式Microsoft.Xna.Framework.Graphics.PackedVector
(MSDN),或在主庫。如果您確實想創建自己的類型,則需要以相同的方式打包struct
(或頂點中的鬆散字段)。
最後,值得指出的是,沒有32位的int
數據類型。而且也不會有任何好處,因爲float
(a Single
)在32位時大小相同。 (和一些圖形處理器在單精度操作,這樣你就不會得到保持額外的精度反正。)
所以我們開始用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 page for VertexElement
's constructor。每個字段的偏移量以字節爲單位指定。
elementUsage
和usageIndex
匹配HLSL中的vertex shader semantics。所以在這個自定義格式中我們有POSITION0
和TEXCOORD0
。
使用IVertexType
是可選的,因爲您也可以直接將VertexDeclaration
傳遞給(例如)VertexBuffer
構造函數。
這應該是你需要的所有信息,如果你想製作一個不同的頂點格式到我提供的。欲瞭解更多信息,有一個blog post by Shawn Hargreaves進入更多關於API的細節。
謝謝安德魯,這是一個非常有用的迴應! :) –
這是非常有用的答案,我一直在尋找它很長一段時間。謝謝! –