2012-02-13 73 views
1

我想知道如何從Texture2D中刪除一部分Texture。 我有一個簡單的遊戲,在這個遊戲中,當一顆子彈擊中它時,我想一塊一塊地炸燬行星。在Texture2D中切割孔

物理已經工作,但我堅持如何正確地切割紋理。

我需要創建一個函數,它將Texture2D的位置和半徑作爲輸入並返回新的Texture2D。

下面是我想要完成的之前和之後的Texture2D示例。 http://img513.imageshack.us/img513/6749/redplanet512examplesmal.png

另請注意,我在火山口洞周圍畫了一個薄的棕色邊框。如果這是可能的,這將是一個很大的獎勵。

+0

爲了澄清,我希望被切掉的部分是透明的。 – JensB 2012-02-13 08:34:33

回答

4

在做了很多關於該主題的搜索之後,它似乎是達到我想要的效果的最好和最快的方法是使用像素着色器。

更具體地說是一種名爲'Alpha映射'的着色器方法。 Alpha映射通過使用原始紋理和另一個定義哪些部分可見或不可見的灰度紋理完成。

着色器的想法是遍歷原始紋理中的每個像素,並檢查灰度圖像中的每個像素在同一座標處的黑度。灰度圖片中的像素越黑,原始紋理中的像素的alpha值越高(更明顯)。由於所有這些都是在GPU上完成的,因此它閃電般快速,並讓CPU準備好爲遊戲製作實際邏輯。

對於我的示例,我將創建一個黑色圖像用作我的灰度圖像,然後在此對應於要刪除的部分上繪製白色圓圈。

我發現一個MSDN的例子有工作XNA 4,做這個(貓例子)的源代碼:

http://create.msdn.com/en-US/education/catalog/sample/sprite_effects

編輯: 我這很好地工作。在這裏創建一個包含源代碼的小教程:http://syntaxwarriors.com/2012/xna-alpha-mapping-with-pixel-shaders/

0

這樣做的一個好方法是在行星紋理頂部使用alphablend渲染一個「孔紋理」。想想它就像在原始紋理上繪製隱形圓圈一樣。 看看這個線程的一些不錯的鏈接worms-style-destructible-terrain

爲了達到你的棕色邊緣,我猜你需要採取類似的方法。首先將半徑爲10px的洞渲染到你的地形上。然後從同一原點渲染另一個圓,但半徑稍大一些,例如12px。然後,您需要將此圓圈設置爲導致棕色的blendmode。

+0

我可能會在這裏錯過一些非常簡單的東西,但是.. 我設置了我的RenderTarget2D,繪製了我的原始紋理,然後想渲染我的洞..我怎麼會渲染洞?紋理是方形的..所以我不能在透明方形紋理的中心有一個透明的圓圈,或者我可以嗎? – JensB 2012-02-13 12:10:43

+0

在其中一個子線程上(http://web.archive.org/web/20090101215451/http://blog.xna3.com/2007/12/2d-deformable-level.html)。他們使用SetData和GetData來實現我之後的結果,但這是將問題提交給CPU,而不是在GPU上執行,因此應該慢得多,並且實際上不是一個好的解決方案,對吧? – JensB 2012-02-13 12:14:09

+0

@wokawka我想我應該補充一點,我沒有在C#中實現這個(只有動作腳本),所以我沒有任何代碼告訴你我知道的作品。但你可以看看這個帖子,它包含一些代碼:[link](http://stackoverflow.com/questions/2656835/xna-alpha-blending-to-make-part-of-a-texture-透明) 它歸結爲您在圖像上繪製圖像,但是可以使用alphablend選項將其設置爲true。這基本上意味着,在將此圖像渲染到地形紋理時,任何重疊區域的Alpha通道都將設置爲透明。 – 2012-02-13 15:37:33

0

看看我這裏的類: http://www.codeproject.com/Articles/328894/XNA-Sprite-Class-with-useful-methods

1.Simply創建Sprite類的一個對象爲你的星球
雪碧PlanetSprite =新的雪碧(PlanetTexture2D,新Vector2(// yourPlanet.X,// yourPlanet .Y));

2.當子彈擊中了行星,使通過碰撞點的使用「GetCollisionPoint(雪碧B)」方法

-you可以具有Circle.png與透明角
中心的圓texure2d - 或者你可以創建一個圓用數學

3.then創建圓的Sprite對象

4.now使用「GetCollisionArea(雪碧b)(如果你想有彈頭威力,這是更好) 「得到重疊區域

5.now使用 「ChangeBatchPixelColor(名單像素,Colour彩色)」,其中像素是重疊的區域和顏色是Color.FromNonPremultiplied(0,0,0,0)

- 音符你不需要畫出你的圈子,在使用它後,你可以摧毀它,或者將它留下以供進一步使用

+0

「本文仍在撰寫中,目前尚未進行一般查看。」 – JensB 2012-02-14 08:05:53

+0

哦,對此,請給我你的電子郵件,我會發送給你的課程,我的電子郵件是[email protected],如果你不想發佈你的。 – 2012-02-14 09:52:23