2010-07-19 8 views
6

मैंने एक 2 डी जंप & रन इंजन लिखा है जिसके परिणामस्वरूप 320x224 (320x240) छवि है। पुराने स्कूल को "पिक्सेल" को बनाए रखने के लिए -फेल, उपयोगकर्ता के संकल्प के अनुसार, परिणामस्वरूप छवि को 2 या 3 या 4 तक स्केल करना चाहूंगा।ऑन-स्क्रीन पिक्सेल स्केल कैसे करें?

मैं प्रत्येक स्प्राइट को स्केल नहीं करना चाहता, बल्कि परिणामस्वरूप छवि!

अग्रिम :)

+0

प्रश्न क्या है? एक छवि को अपस्केल कैसे करें? या "पिक्सेललेट" प्रभाव को कैसे कार्यान्वित करें? – Gobra

उत्तर

1

धन्यवाद मैं बिल्कुल यकीन है कि आप द्वारा "में ... एक छवि है, जिसके परिणामस्वरूप" क्या मतलब है नहीं कर रहा हूँ लेकिन यदि आप अपने अंत मतलब परिणाम एक बनावट है, तो आप स्क्रीन पर आकर्षित कर सकते हैं कि और एक स्केल सेट करें:

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

बस जो भी संख्या आप चाहते हैं (2, 3, या 4) के साथ स्केल को प्रतिस्थापित करें। मैं कुछ समान करता हूं लेकिन स्क्राइट प्रति स्केल करता हूं न कि परिणामी छवि। यदि आपका मतलब कुछ और है तो मुझे बताएं और मैं मदद करने की कोशिश करूंगा।

एक्सएनए स्केल की गई छवि को एंटी-एलाइजिंग के लिए डिफ़ॉल्ट करता है। आप pixelated अच्छाई बनाए रखना चाहते हैं, तो आप तत्काल तरह मोड में आकर्षित और कुछ अतिरिक्त पैरामीटर सेट करना होगा:

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' सेट करना चाहते हैं (और दूसरों को 'प्वाइंट' के रूप में छोड़ दें)। –

+0

मैंने इसे अभी देखा और यह वह बिंदु है जिसे आप चाहते हैं – Bob

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)); 
} 

और फिर है कि समारोह के माध्यम से अपनी स्थिति को हर बार जब आप एक स्प्राइट आकर्षित पारित: पहले इस तरह एक समारोह है। यद्यपि यह संभवतः काम नहीं कर सकता है अगर आपके sprites किसी भी रोटेशन या ऑफसेट का उपयोग करें। और फिर आप प्रत्येक एकल ड्रॉ कॉल को संशोधित करने के लिए वापस आ जाएंगे।

ऐसा करने के लिए "सही" तरीका, यदि आप अपने पूरे दृश्य का सादा बिंदु-वार स्केल-अप चाहते हैं, तो अपने दृश्य को मूल आकार में एक प्रस्तुत करने के लक्ष्य को आकर्षित करना है। और फिर स्क्रीन पर अपना रेंडर लक्ष्य बनाएं, स्केल किया गया (TextureFilter.Point के साथ)।

जिस फ़ंक्शन को आप देखना चाहते हैं वह GraphicsDevice.SetRenderTarget है। This MSDN article पढ़ने योग्य हो सकता है। यदि आप एक्सएनए 4.0, this might be worth reading पर जा रहे हैं या आगे बढ़ रहे हैं।

मुझे इसके लिए एक आसान एक्सएनए नमूना नहीं मिला, लेकिन Bloom Postprocess नमूना एक रेंडर लक्ष्य का उपयोग करता है जो उसके बाद एक धुंधला शेडर लागू करता है। आप आसानी से शेडर को अनदेखा कर सकते हैं और केवल स्केल-अप कर सकते हैं।

3

आप एक पिक्सेलेशन प्रभाव का उपयोग कर सकते हैं। RenderTarget2D पर जाएं, फिर पिक्सेल शेडर का उपयोग करके परिणाम को स्क्रीन पर खींचें। वहाँ सकता है जो आपको पिक्सेल shaders की कोशिश एक उपकरण Shazzam छायांकर्ता संपादक कहा जाता है और यह है कि करता है पिक्सेलेशन एक में शामिल हैं: http://shazzam-tool.com/

यह नहीं हो सकता है कि तुम क्या चाहते थे, लेकिन यह एक उच्च संकल्प मोड अनुमति देने के लिए और के लिए अच्छा हो सकता है कोई बात नहीं क्या संकल्प इस्तेमाल किया गया था एक ही प्रभाव पड़ रहा ... Before

After

संबंधित मुद्दे