1

我目前正在从事一个涉及使用 VertexPositionTextures 设置大量顶点数据的项目。这最终会占用大量内存,尽管我可以针对当前内存中的内容以及可以卸载到硬盘驱动器的内容进行一些优化,但我想以各种可能的方式进行优化。

那么我的问题是:有没有一种方法可以重写 VertexPositionTexture 结构,以便它使用我的自定义 IntVector 类来使用更少的空间?这是否也需要对 DrawPrimitives 和 DrawUserPrimitives 进行修改?

我问这个是因为我没有使用纹理图集,所以我的 UV 坐标总是 (0,0),(0,1),(1,0),(1,1) 可以不用浮点数表示,并且我的顶点位置也可以很容易地用整数表示。

4

1 回答 1

4

是的,你可以这样做。你只需要定义一个自定义的顶点格式,剩下的交给 XNA 来做。

要记住的最重要的事情是,您只能使用 available VertexElementFormats ( 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中的顶点着色器语义elementUsageusageIndex匹配。所以在这种自定义格式中,我们有和。POSITION0TEXCOORD0

的使用IVertexType是可选的,因为您也可以将 aVertexDeclaration直接传递给(例如)VertexBuffer构造函数。


如果您想制作与我提供的不同的顶点格式,这应该是您需要的所有信息。有关更多信息,Shawn Hargreaves 的博客文章详细介绍了 API。

于 2012-08-30T08:22:36.177 回答