स्प्राइट के साथ स्पंदन प्रदान करता है


9

मेरे खेल में वेग जोड़ने के बाद, मुझे लगता है कि मेरे बनावट चिकोटी काट रहे हैं। मुझे लगा कि यह सिर्फ मेरी आंखें हैं, जब तक कि मैंने आखिरकार इसे स्क्रीनशॉट में कैद नहीं किया:

यहाँ छवि विवरण दर्ज करें

बाईं ओर एक है जो मेरे खेल में प्रस्तुत करता है; दायीं ओर वाला मूल स्प्राइट है, जिसे चिपकाया जाता है। (यह फोटोशॉप से ​​एक स्क्रीनशॉट है, जिसे 6x में ज़ूम किया गया है।)

ध्यान दें कि किनारे अलियासिंग हैं - यह लगभग उप-पिक्सेल रेंडरिंग जैसा दिखता है। वास्तव में, यदि मैंने पूर्णांक मानों का उपयोग करने के लिए अपने स्प्राइट्स (जो कि स्थिति और वेग के रूप में है) को मजबूर नहीं किया था, तो मैं शपथ लेता हूं कि मोनोमेग फ्लोटिंग पॉइंट मूल्यों के साथ ड्राइंग कर रहा है। लेकिन ऐसा नहीं है।

धुंधली दिखने वाली इन चीजों का कारण क्या हो सकता है? यह लागू वेग के बिना नहीं होता है।

सटीक होने के लिए, मेरी SpriteComponentकक्षा में एक Vector2 Positionक्षेत्र है। जब मैं फोन करता हूं Draw, मैं अनिवार्य रूप new Vector2((int)Math.Round(this.Position.X), (int)Math.Round(this.Position.Y))से स्थिति के लिए उपयोग करता हूं ।

मेरे पास एक बग था जहां पहले भी स्थिर वस्तुएं घबराहट करती थीं - जो कि सीधे Positionवेक्टर का उपयोग करने और मूल्यों को गोल न करने के कारण था ints। यदि मैं गोल के बजाय Floor/ का उपयोग करता हूं Ceiling, तो स्प्राइट सिंक / होवर (एक पिक्सेल अंतर दोनों तरह से) लेकिन फिर भी धुंधला हो जाता है।


1
क्या यह बनावट फ़िल्टरिंग से संबंधित हो सकता है?
मूलदेव

क्या आपके पास आपके shader के लिए कोड है? कुछ लोग पिक्सेल को केंद्रित करने के लिए दोनों अक्ष पर आधा पिक्सेल जोड़ते हैं। हालांकि यकीन नहीं है, मुझे लगता है कि यह केवल एक DirectX है।
विलियम मैरीजर

3
फ़िल्टरिंग को निष्क्रिय करना एक समाधान है न कि समाधान।
आर्ची डेसी

1
प्रतिपादन आपके वेग के बारे में कुछ भी नहीं जानता है, इसलिए या तो स्थिति, आकार या कुछ और आपके पास SpriteBatch.Draw के साथ पास है या अलग है या त्रुटि आपके द्वारा वेग जोड़े जाने से पहले मौजूद थी। आप SpriteBatch.Draw को वास्तव में कैसे कहते हैं?
आर्ची डेसी

1
@ ashes999 ने इस कॉल को डीबग किया और यह चेक किया। x, this.Y और this.origin यह क्या है? मूल रूप से कोई रास्ता नहीं है जब यह ड्रा कॉल समान होता है तो रेंडर परिणाम अलग होता है।
आर्ची डेसी

जवाबों:


3

खैर, यह शर्मनाक है।

यह पता चला है कि मैं पूर्णांक पदों का उपयोग नहीं कर रहा था, लेकिन फ्लोट स्थिति। आर्ची ने अपनी टिप्पणी के साथ मुझे सही रास्ता बताया@ashes999 did you debug this call and checked this.X, this.Y and this.origin?

जैसे ही मैंने एक ट्रेस स्टेटमेंट जोड़ा, मैंने देखा कि कुछ भी पता नहीं चला। यह पता चला है कि मेरी SpriteComponentकक्षा ने पूर्णांक मानों का सही उपयोग किया है, लेकिन मेरे SpriteSheetComponentअभी भी कच्चे से फ्लोट मूल्यों का उपयोग किया गया है Vector2 Position

हालाँकि मैंने बनावट फ़िल्टरिंग और क्लैम्पिंग का प्रयास नहीं किया, मुझे संदेह था कि ये सही परिवर्तन नहीं थे, क्योंकि मैं स्रोत की छवि (कोई स्केलिंग) के समान चौड़ाई और ऊंचाई पर 2 डी छवि बना रहा था।


1
हो गया, ख़ुशी आपको मिली!
आर्ची डेसी

2

XNA DirectX9 का उपयोग करता है जो पिक्सेल के केंद्र को उसके स्थान के रूप में उपयोग करता है। ड्रा वर्ग के वेक्टर 2 आधारित अधिभार का उपयोग करते समय यह ध्यान देने योग्य है। मेरा मानना ​​है कि घटाना (.5, .5) को आपकी समस्या ठीक करनी चाहिए।

अधिक जानकारी यहाँ।


मैं तकनीकी रूप से ऐसा नहीं कर सकता, क्योंकि मैं एक वेक्टर 2 int, intमें तर्क के साथ गुजर रहा हूं । इसके अलावा, जब चीजें गति में नहीं होती हैं तो चीजें बिल्कुल ठीक दिखती हैं।
as999999

गति से वस्तु का क्या अर्थ है? XNA के पास गति की कोई धारणा नहीं है यह उन चीजों को आकर्षित करता है जहां आप इसे बताते हैं। यह स्थिर स्नैपशॉट की एक श्रृंखला है। आयत ओवरलोड्स का उपयोग करने का भी प्रयास करें क्योंकि आप किसी भी आयत के चक्कर लगा रहे हैं।
क्लासिकथंडर

मेरे पास वेग का अपना कार्यान्वयन है। SpriteComponentएक Vector2स्थिति है, जो वेग के आधार पर तैरती हुई बढ़ती है; जब मैं आकर्षित करता हूं, तो मैं Vector2अपने positionएक्स और वाई के पूर्णांक (गोल) संस्करणों के साथ एक नया बनाता हूं । यह मुद्दा नहीं है, क्योंकि वेग के बिना स्थिर ऑब्जेक्ट ठीक दिखाई देते हैं।
ashes999

तो आपका यह कहना कि आपके पास एक स्थिति सदिश p और एक वेग सदिश v है, उन्हें p + = v के रूप में जोड़ें, फिर गोल मानों का उपयोग करके p की एक प्रति बनाएँ। और यह कि यह अलग-अलग मूल्य है फिर एक स्थिति है जो पिछले p + = v के समान है, ड्रॉ कॉल समान होने के बावजूद? क्योंकि इससे कोई मतलब नहीं है।
क्लासिकथुंदर

हां, यही @Archy भी कह रहा है। मुझे डिबग करें और फिर से जांचें। मैं p += vदौरान जोड़ता हूं Update, और साथ प्रस्तुत करता हूं new Vector2((int)Math.Round(p.X), (int)Math.Round(p.Y)))
ashes999

2

प्रतिपादन आपके वेग के बारे में कुछ नहीं जानता है, इसलिए या तो स्थिति, आकार या स्प्राइटबैच के साथ आपके पास कुछ भी हो सकता है। विवाद अलग है या आपके द्वारा वेग जोड़े जाने से पहले त्रुटि मौजूद थी। आप SpriteBatch.Draw को वास्तव में कैसे कहते हैं?

क्या आपने इस कॉल को डीबग किया है और यह चेक किया है। X, this.Y और this.origin यह क्या है? मूल रूप से कोई रास्ता नहीं है जब यह ड्रा कॉल समान होता है तो वेग के साथ रेंडर परिणाम अलग होता है।


1

समस्या यह है कि बनावट फ़िल्टरिंग चालू है। यदि आप निश्चित नहीं हैं कि इसका क्या मतलब है, तो उस स्थिति पर विचार करें जहां आपकी छवि 2 पिक्सेल चौड़ी है: पहला पिक्सेल काला है, दूसरा पिक्सेल सफेद है। यदि आप इस बनावट को ज़ूम इन करते हैं, यदि बनावट फ़िल्टरिंग चालू है, तो आप देखेंगे कि यह धुंधली हो गई है और काले और सफेद पिक्सेल के बीच का क्षेत्र एक ढाल ग्रे रंग का उपयोग करता है।

फ़िल्टरिंग के साथ और बिना खेल का एक उत्कृष्ट उदाहरण सुपर मारियो 64 है जो फ़िल्टरिंग के दौरान था जबकि डूम ने नहीं किया था।

जब आप वेग का उपयोग नहीं करते हैं, तो आपके स्प्राइट को तैनात किया जाता है ताकि बनावट का केंद्र नमूना बिंदु पर हो कि XNA (या जो भी अंतर्निहित एपीआई का उपयोग किया जा रहा है) रंग को हथियाने में है। जब आप एक फ्लोट वेग के साथ आगे बढ़ते हैं, तो आपके स्प्राइट की स्थिति बदल जाती है, इस प्रकार नमूना बिंदु एक पिक्सेल के केंद्र के साथ सीधे पंक्तिबद्ध नहीं हो सकता है, इसलिए अंतिम परिणाम यह है कि एक रंग जो निकटतम पिक्सेल का औसत है रेंडर करता था।

आप यह सत्यापित कर सकते हैं कि स्क्रीन पर आपके स्प्राइट को वास्तव में बड़े रूप से रेंडर करके फ़िल्टरिंग चालू है। अगर यह धुंधली है, तो यह मुद्दा है।

यदि आपके पास रेंडरिंग में पिक्सेल-परफेक्ट सटीकता है, तो आप चाहते हैं कि आपके पास कहीं से संग्रहीत स्थिति के लिए एक फ्लोट मूल्य हो, लेकिन जिस ऑब्जेक्ट को आप प्रस्तुत कर रहे हैं, उसकी स्थिति के लिए पूर्णांक मानों का उपयोग करें ... या निश्चित रूप से आप फ़िल्टरिंग को बंद कर सकते हैं। अगर आपके खेल को इसकी जरूरत नहीं है।

तुम भी पढ़ सकते हैं इस


जैसे मैंने अपने प्रश्न में उल्लेख किया है, मैं पहले से ही अपने स्थान और मूल छवि के आकार के लिए पूर्णांक का उपयोग कर रहा हूं, जब मैं फोन करता हूं Draw। तो मुझे यकीन नहीं है कि ऐसा कैसे हो सकता है - लेकिन मैं बड़े पैमाने पर प्रतिपादन करने की कोशिश करूंगा और यह देखूंगा कि क्या बनावट को छानने में मदद मिलेगी।
ashes999

1

SpriteBatch.Begin कॉल में SamplerState.PointClamp के लिए अपना SamplerState सेट करने का प्रयास करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.