2012-06-23 90 views
0

正如標題所述,我試圖在考慮SpriteBatch.Draw()之前調整Texture2D的大小。我這樣做的原因是我試圖用任意Texture2D來填充任意多邊形,佈局的頂點由Vector2D定義。不用繪製調整Texture2D的大小

我在想什麼的是創建適合多邊形,縮放Texture2D到矩形的矩形,然後通過透明Texture2DGetData<>()SetData<>()使那些多邊形外的象素。

我已經找到了適合多邊形的矩形,但有沒有辦法調整Texture2D的尺寸,還是我以完全錯誤的方式去做?謝謝!

+0

如果您正在縮放,那麼當您將參數傳遞給Draw時,texture2d將自動縮放。你的Texture2D應該在內存中保持不變,你的繪圖應該改變紋理 – Charleh

+0

請記住,使用CPU來縮放它可能是一個壞主意(就像你打算這樣做)。例如'Draw()'方法重載使用GPU。我想還有一種方法可以使用混合遮罩,只用最少的CPU資源就可以修剪多邊形的外側。 – dialer

回答

1

你錯了。設置紋理數據很昂貴。 (可能還有一些濾波問題。)

你想要做的是設置你正在繪製的頂點的紋理座標(「UV座標」)。這會導致紋理的特定位置出現在多邊形的頂點。然後將落在多邊形之外的紋理根本不會繪製(它由多邊形邊緣「裁剪」)。

從紋理的左上角到右下角,指定紋理座標的範圍爲0.0到1.0(在U和V軸上 - 水平和垂直)。

如果您使用頂點緩衝區繪圖,XNA包含一些內置頂點結構,如VertexPositionTextureVertexPositionColorTexture,允許您指定TextureCoordinate值。

如果您使用自己的頂點結構,則在指定VertexElement時使用VertexElementUsage.TextureCoordinate。如果您要創建自己的着色器,則該值將在TEXCOORD0(用於使用索引0)中顯示。


如果你是剛剛繪製矩形與SpriteBatch,然後指定sourceRectangle當你調用Draw

+0

我將此標記爲答案,因爲儘管它沒有給我所需要的一切,但它最終成了我所用的。不過,我不得不做大量的研究才能最終實現它。 :P – benjer3

0

聽起來你應該使用在Draw方法的重載(我知道你是出於某種原因不想這樣做,但它是這樣一個很好的理由):

public void Draw (
    Texture2D texture, 
    Vector2 position, 
    Nullable<Rectangle> sourceRectangle, 
    Color color, 
    float rotation, 
    Vector2 origin, 
    Vector2 scale, 
    SpriteEffects effects, 
    float layerDepth 
) 

的sourceRectangle,規模參數,起源應該足夠了。不要修改紋理在內存中,這是比較昂貴要做到這一點(特別是做每一幀!)

http://msdn.microsoft.com/en-us/library/bb196420(v=xnagamestudio.31).aspx

你能解釋一下爲什麼你不希望縮放抽獎()?

+0

我可能只是不理解事情,但基本上我想要的是一個新的紋理。我試圖裁剪紋理中不包含在多邊形中的部分,但如果紋理比多邊形小或大,我不能這樣做。我不會每一幀都這麼做。我只是在構造函數中做它。我會嘗試發佈我想要的視覺例子。 – benjer3

+0

我想我明白你想要什麼,但你爲什麼試圖去做?僅僅使用完整的紋理有沒有問題,但是有些部分沒有繪製?將其縮放到多邊形邊界框的大小,並將原點設置爲0,0,並將縮放比例設置爲 – Charleh

+0

。如何讓多邊形外部的像素不顯示。抱歉,我是XNA的新手。我可能試圖用錯誤的方式去做事情。 – benjer3

相關問題