2012-08-29 59 views
1

我目前正在使用VertexPositionTextures處理一個涉及設置大量頂點數據的項目。這最終會消耗大量的內存,雖然我可以做一些優化,但內存中的內容以及可以卸載到硬盤上的內容都可以做到,但我希望儘可能地進行優化。重寫VertexPositionTexture以使用整數向量

我的問題然後:有沒有辦法我可以重寫VertexPositionTexture結構,使它使用我的自定義IntVector類來使用更少的空間?這是否需要修改DrawPrimitives和DrawUserPrimitives?我問這個,因爲我沒有使用紋理圖集,所以我的UV座標總是(0,0),(0,1),(1,0),(1,1),它可以表示沒有浮點數,我的頂點位置也可以用整數很容易地表示。

回答

4

是的,你可以這樣做。你只需要定義一個自定義的頂點格式,XNA將完成剩下的工作。

要記住最重要的事情是,你只限於使用元素可用VertexElementFormat S(MSDN) - 指出,HalfVector格式不在Reach輪廓(info)可用。

你也許並不需要創建自己的矢量類型,因爲XNA已經提供了實現所有可用的格式Microsoft.Xna.Framework.Graphics.PackedVectorMSDN),或在主庫。如果您確實想創建自己的類型,則需要以相同的方式打包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; } 
    } 
} 

創建一個自定義頂點類型時,重要的是要確保字段匹配您在VertexDeclarationMSDN)指定的順序和佈局。你如何創建你的VertexDeclaration應該不言自明 - 只需看看MSDN page for VertexElement's constructor。每個字段的偏移量以字節爲單位指定。

elementUsageusageIndex匹配HLSL中的vertex shader semantics。所以在這個自定義格式中我們有POSITION0TEXCOORD0

使用IVertexType是可選的,因爲您也可以直接將VertexDeclaration傳遞給(例如)VertexBuffer構造函數。


這應該是你需要的所有信息,如果你想製作一個不同的頂點格式到我提供的。欲瞭解更多信息,有一個blog post by Shawn Hargreaves進入更多關於API的細節。

+0

謝謝安德魯,這是一個非常有用的迴應! :) –

+0

這是非常有用的答案,我一直在尋找它很長一段時間。謝謝! –