2010-02-08 51 views
1

我使用D3DXSprite繪製紋理。
我想轉換它們(旋轉,縮放等),所以我使用SetTransfrom方法。
我應該存儲舊的轉換 - >設置一個新的 - >繪製 - >設置舊的轉換? 我有一個Sprite類,負責繪製和更新方法。 我的意思是這樣的:Direct3D Sprite-> SetTransform用法?

D3DXMatrix oldMatrix; 
sprite->GetTransfrom(&oldMatrix); 

D3DXMatrix newMatrix; 
D3DXMatrixScaling(&newMatrix, 2.0f, 2.0f, 0.0f); 

sprite->SetTransform(&newMatrix); 
sprite->Draw(...); 

sprite->SetTransform(&oldMatrix); 

好/壞?

回答

1

什麼是壞的是檢索oldMatrix並用它來計算newMatrix(精度問題)。在每次新抽籤時重新計算一個新的矩陣更好。

你可能想要爲每個精靈存儲的是位置,旋轉和縮放因子。

+0

我該如何重新計算一個新矩陣? – Adir 2010-02-08 13:00:50

+0

您可以使用D3DXMatrixTransformation2D(假設您有2D精靈) – Stringer 2010-02-08 13:28:00

1

TBH drawing 2 tris(我假設你的精靈是由什麼組成的)改變變換和繪圖是非常低效的。

手動將4個垂直轉換爲1個大動態頂點緩衝區並將所有內容呈現在oner上,你的效果要好得多。適用於精靈的紋理也一樣。將它們保持在一個很大的紋理中可以爲你節省很多狀態變化,並讓你的渲染速度遠遠快於整體。

編輯:進行多個DrawPrimitive/DrawIndexedPrimitive調用非常緩慢。對於您設置的每個矩陣,您需要進行單獨的繪圖調用。避免這種情況的方法是將矩陣應用於4個頂點中的每一個,然後將它們複製到已經變換的頂點緩衝區中。這意味着您可以使用身份世界矩陣集進行一次繪製調用。

事後認爲,ID3DXSprite很可能會將此內容從您中抽象出來,因爲您無法設置角點。如果沒有將它從你身上抽象出來,性能真的很糟糕。

但是,它不太可能會將紋理問題抽象出來。因此,最好將一個精靈的所有幀存儲在一個紋理中(可能還有一個紋理中的所有多個精靈幀)。因此,在這種情況下,最好傳遞一個IDirect3DTexture,並將pSrcRect設置爲您所處的任何幀的子矩陣,而不是使用單獨的紋理。您使用的紋理越少,性能越好。

+0

是否有任何代碼示例?我還沒有完全明白它 – Adir 2010-02-09 14:08:20

+0

也許另見:http://blogs.msdn.com/shawnhar/archive/2010/03/22/point-sprites-in-xna-game-studio-4-0.aspx – Stringer 2010-03-23 23:52:48