是的,你可以这样做。你只需要定义一个自定义的顶点格式,剩下的交给 XNA 来做。
要记住的最重要的事情是,您只能使用 available VertexElementFormat
s ( MSDN ) 中的元素 - 请注意这些格式在配置文件 ( info )HalfVector
中不可用。Reach
您可能不需要创建自己的向量类型Microsoft.Xna.Framework.Graphics.PackedVector
,因为 XNA 已经为( MSDN ) 或主库中的所有可用格式提供了实现。如果您确实想创建自己的类型,它需要是一个struct
(或顶点中的松散字段)以相同的方式打包。
最后,值得指出的是,没有 32 位int
数据类型。而且也没有任何好处,因为 a 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
是可选的,因为您也可以将 aVertexDeclaration
直接传递给(例如)VertexBuffer
构造函数。
如果您想制作与我提供的不同的顶点格式,这应该是您需要的所有信息。有关更多信息,Shawn Hargreaves 的博客文章详细介绍了 API。