2010-07-19 193 views
6

我寫了一個2D Jump &運行引擎,產生一個320x224(320x240)的圖像。爲了保持舊學校的「像素」 - 感受到它,我想根據用戶的分辨率將結果圖像縮放2或3或4。如何縮放屏幕上的像素?

我不想縮放每個精靈,但是由此產生的圖像!

感謝提前:)

+0

問題是什麼?如何升級圖像?或者如何實現「像素化」效果? – Gobra 2010-07-19 18:02:10

回答

1

我不完全相信你所說的「造成...的圖像」的意思,但如果你的意思是你的最終結果是紋理,那麼你可以繪製到屏幕並設置一個比例尺:

spriteBatch.Draw(texture, position, source, color, rotation, origin, scale, effects, depth); 

只需用您想要的任何數字(2,3或4)替換比例。我做了類似的事情,但是每個精靈都會縮放,而不是生成的圖像。如果你的意思是別的,讓我知道,我會盡力幫忙。

XNA默認爲抗鋸齒比例圖像。如果您想保留像素化的善良,你需要在即時排序方式繪製,並設置一些額外的參數:

spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.None); 
GraphicsDevice.SamplerStates[0].MagFilter = TextureFilter.Point; 
GraphicsDevice.SamplerStates[0].MinFilter = TextureFilter.Point; 
GraphicsDevice.SamplerStates[0].MipFilter = TextureFilter.Point; 

它或者點或無TextureFilter。我在工作,所以我試圖記住我的頭頂。今天晚些時候我會確認一種方式。

+0

根據文檔,'TextureFilter.None'僅僅用於'MipFilter'來禁用它(並且只使用MagFilter)。你可能*想*爲此效果設置'MipFilter = TextureFilter.None'(並將其他人作爲'Point')。 – 2010-07-20 04:51:40

+0

我只是看着它,它是你想要的點 – Bob 2010-07-20 14:14:50

4

Bob's answer將濾鏡模式更改爲TextureFilter.Point是正確的,以保持好看和像素化。

但可能比縮放每個精靈(你也不得不擴展每個精靈的位置)是隻通過一個矩陣來SpriteBatch.Begin,像這樣一個更好的方法:

sb.Begin(/* first three parameters */, Matrix.CreateScale(4f)); 

這將使您無需修改​​所有繪圖調用即可進行縮放。

但值得注意的是,如果您在遊戲中使用浮點偏移,則在放大之後(使用任一方法),最終會出現與像素邊界不對齊的情況。

有兩種解決方案。第一個是有這樣的功能:

public static Vector2 Floor(Vector2 v) 
{ 
    return new Vector2((float)Math.Floor(v.X), (float)Math.Floor(v.Y)); 
} 

然後,每次你畫一個精靈,通過你的位置通過該函數。儘管如果你的精靈使用任何旋轉或偏移量,這可能不起作用。再次,你會回到修改每一個平局。

如果您想要對整個場景進行簡單的逐點放大,則「正確」執行此操作的方法是將場景以原始大小繪製到渲染目標。然後畫你的渲染目標到屏幕上,放大(與TextureFilter.Point)。

你想看的功能是GraphicsDevice.SetRenderTargetThis MSDN article可能值得一讀。如果您正在使用或移動到XNA 4.0,this might be worth reading

我很快找不到更簡單的XNA示例,但Bloom Postprocess示例使用渲染目標,然後將模糊着色器應用於此渲染目標。您可以完全忽略着色器,只需進行放大。

3

您可以使用像素化效果。繪製到RenderTarget2D,然後使用Pixel Shader將結果繪製到屏幕上。有一個叫Shazzam着色器編輯器工具,它可以讓你嘗試了像素着色器,它包括一個沒有像素結構: http://shazzam-tool.com/

這可能不是你想要的,但它可以允許高分辨率模式和好具有同樣的作用,不管是用什麼分辨率... Before

After