स्प्राइट शीट बनावट आसन्न बनावट के किनारों को उठाती है


10

मेरे पास एक कस्टम स्प्राइट रूटीन (ओपनजीएल 2.0) है जो एक साधारण स्प्राइट शीट का उपयोग करता है (मेरे बनावट एक दूसरे के बगल में क्षैतिज रूप से व्यवस्थित होते हैं)।

इसलिए, उदाहरण के लिए, यहाँ 2 सरल बनावट के साथ एक परीक्षण स्प्राइट शीट है:

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

अब, जब मैं अपनी ओपनजीएल स्प्राइट ऑब्जेक्ट बनाता हूं, तो उसके एटलस में फ्रेम की कुल संख्या निर्दिष्ट करता है और ड्राइंग करते समय, निर्दिष्ट करता हूं कि मुझे किस फ्रेम को आकर्षित करना है।

इसके बाद यह पता चलता है कि बनावट कहाँ से पकड़नी है:

फ्रेम की कुल संख्या (बाएं समन्वय प्राप्त करने के लिए) आवश्यक फ्रेम संख्या को विभाजित करना

और फिर तख्ते की कुल संख्या से 1 डाइविंग और बाएं हाथ के परिणाम को ऊपर से समन्वयित करके जोड़ना।

यह काम करने लगता है लेकिन कभी-कभी मुझे समस्या हो जाती है। उदाहरण के लिए, मैं नीचे दिए गए एक्स को आकर्षित करना चाहता हूं और मुझे ..........।

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

मैंने प्रत्येक बनावट के बीच 1 px का 'पैडिंग' लगाने के बारे में सुना है, लेकिन क्या कोई यह बता सकता है कि यह कैसे काम करता है? मेरा मतलब है कि अगर मैं ऐसा करता हूं तो यह निश्चित रूप से बनावट प्राप्त करने के लिए गणनाओं को फेंक देगा।

यदि मैं सरलता से उठाया बनावट में पैडिंग शामिल करता हूं (इसलिए स्प्राइट को एक खाली सीमा के साथ खींचा जाता है), तो निश्चित रूप से यह टकराव का पता लगाने में समस्या पैदा करेगा? (यानी स्प्रिट्स पारदर्शी भागों के टकरा जाने पर बाउंडिंग बॉक्स का उपयोग करते समय टकराते हुए दिखाई दे सकते हैं)।

अगर कोई समझा सकता है तो सराहना करेंगे।


क्या आप बनावट को प्रस्तुत करने के लिए उपयोग कर रहे हैं GL_NEARESTया कर रहे हैं GL_LINEAR?
MichaelHouse

मैं GL_Linear @ Byte56
BungleBonce

जवाबों:


15

बनावट एटलस और आसन्न टेक्सल्स का उपयोग करने के साथ समस्या यह है कि रैखिक बनावट को छानने के तरीके के साथ क्या करना है।

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

यहाँ समस्या का एक अच्छा दृश्य है:

  

चूंकि आप GL_CLAMP_TO_EDGEबनावट एटलस में कुछ उपयोग नहीं कर सकते हैं , इसलिए आपको प्रत्येक बनावट के किनारे के आसपास बॉर्डर टेक्सल्स बनाने की आवश्यकता है। ये बॉर्डर टेक्सल्स ऊपर बताए गए भारित प्रक्षेप के माध्यम से पड़ोसी नमूनों को पूरी तरह से अलग-अलग बनावट से एटलस में बदलने से रोकेंगे।

ध्यान दें कि जब आप अनिसोट्रोपिक फ़िल्टरिंग का उपयोग करते हैं, तो आपको सीमा की चौड़ाई बढ़ाने की आवश्यकता हो सकती है। ऐसा इसलिए है क्योंकि अनिसोट्रोपिक फ़िल्टरिंग चरम कोण पर नमूना पड़ोस के आकार को बढ़ाएगा।


प्रत्येक बनावट के किनारे के चारों ओर एक सीमा का उपयोग करके मेरा क्या मतलब है, यह स्पष्ट करने के लिए, ओपनजीएल में उपलब्ध विभिन्न रैप मोड पर विचार करें। पर विशेष ध्यान दें CLAMP TO EDGE

  http://lucera-project.com/blog/wp-content/uploads/2010/06/wrap.png

"क्लैम्प टू बॉर्डर" नामक एक मोड होने के बावजूद, वास्तव में वह नहीं है जिसमें हम रुचि रखते हैं। यह मोड आपको किसी भी बनावट के लिए एक सीमा के रूप में उपयोग करने के लिए एक एकल रंग को परिभाषित करने देता है जो सामान्यीकृत [0.0] के बाहर गिरता है -1.0] रेंज।

हम जो चाहते हैं, उसके व्यवहार को दोहराने के लिए है CLAMP_TO_EDGE, जहां किसी भी बनावट के लिए (उप-) बनावट के लिए उचित सीमा के बाहर समन्वय होता है, उस दिशा में अंतिम टेक्सल सेंटर का मूल्य प्राप्त करता है, जिसमें वह सीमा से बाहर था। चूंकि आपका लगभग पूरा नियंत्रण है। बनावट एक एटलस प्रणाली में निर्देशांक करता है, जिसमें एकमात्र परिदृश्य (प्रभावी) बनावट निर्देशांक हो सकता है कि आपकी बनावट के बाहर किसी स्थान का उल्लेख हो, जो बनावट फ़िल्टरिंग के भारित औसत चरण के दौरान हो।

हम जानते हैं कि GL_LINEARऊपर के आरेख में देखे गए 4 निकटतम पड़ोसियों का नमूना होगा, इसलिए हमें केवल 1-टेक्सल सीमा की आवश्यकता है। यदि आप अनिसोट्रोपिक फ़िल्टरिंग का उपयोग करते हैं, तो आपको एक व्यापक टेक्सल बॉर्डर की आवश्यकता हो सकती है, क्योंकि यह कुछ शर्तों के तहत नमूना पड़ोस के आकार को बढ़ाता है।

यहां एक बनावट का उदाहरण दिया गया है जो सीमा को अधिक स्पष्ट रूप से दिखाता है, हालांकि आपके उद्देश्यों के लिए आप सीमा 1 टेक्सल या 2 टेक्सल्स को चौड़ा कर सकते हैं।

  

(नोट: मैं जिस सीमा का उल्लेख कर रहा हूं, वह छवि के सभी चार किनारों के आसपास की काली नहीं है, लेकिन वह क्षेत्र जहां बिसात का पैटर्न नियमित रूप से दोहराना बंद कर देता है)

यदि आप सोच रहे थे, तो यहाँ मैं अनिसोट्रोपिक फ़िल्टरिंग क्यों ला रहा हूँ। यह कोण के आधार पर नमूना पड़ोस का आकार बदलता है और फ़िल्टरिंग के लिए 4 से अधिक टेक्सल्स का उपयोग कर सकता है:

  http://www.arcsynthesis.org/gltut/Texturing/ParallelogramDiag.svg

आपके द्वारा उपयोग किए जाने वाले अनिसोट्रॉपी की डिग्री जितनी अधिक होगी, आपको 4 से अधिक टेक्सल्स वाले नमूना पड़ोस से निपटना होगा। अधिकांश ऐसोट्रोपिक फ़िल्टरिंग स्थितियों के लिए एक 2 टेक्सल सीमा पर्याप्त होनी चाहिए।


अंतिम लेकिन कम से कम, यहां बताया गया है कि कैसे एक पैक किए गए बनावट एटलस का निर्माण किया जाएगा GL_CLAMP_TO_EDGEजो एक GL_LINEARबनावट फिल्टर की उपस्थिति में व्यवहार को दोहराएगा:

( काले निर्देशांक में एक्स और वाई से 1 घटाएं, मैंने पोस्ट करने से पहले छवि को पढ़ने का सबूत नहीं दिया। )   

सीमा भंडारण के कारण, इस एटलस में 4 256x256 बनावट के भंडारण के लिए 516x516 आयामों के साथ एक बनावट की आवश्यकता होती है। सीमाओं को रंग कोडित किया जाता है, जिसके आधार पर आप उन्हें एटलस निर्माण के दौरान टेक्सल डेटा के साथ भरेंगे:

  • लाल = सीधे नीचे टेक्सल के साथ बदलें
  • पीला = सीधे ऊपर टेक्सल के साथ बदलें
  • हरा = टेक्सल के साथ सीधे बाईं ओर बदलें
  • ब्लू = सीधे टेक्सल के साथ दाईं ओर बदलें

इस पैक किए गए उदाहरण में प्रभावी रूप से, एटलस में प्रत्येक बनावट एटलस के 258x258 क्षेत्र का उपयोग करती है, लेकिन आप बनावट को निर्देशांक उत्पन्न करेंगे जो कि दृश्य 256x256 क्षेत्र में दिखाई देगा। बॉर्डरिंग टेक्सल्स का उपयोग केवल तब किया जाता है जब एटलस में बनावट के किनारों पर बनावट फ़िल्टरिंग की जाती है, और जिस तरह से वे मिमिक GL_CLAMP_TO_EDGEव्यवहार को डिज़ाइन करते हैं ।

यदि आप सोच रहे थे, तो आप एक समान दृष्टिकोण का उपयोग करके अन्य प्रकार के रैप मोड GL_REPEATको लागू कर सकते हैं - बनावट एटलस में बाएं / दाएं और ऊपर / नीचे सीमा टेक्सल्स का आदान-प्रदान करके कार्यान्वित किया जा सकता है और थोड़ा सा चतुर बनावट एक में गणित का समन्वय कर सकता है शेडर। यह थोड़ा अधिक जटिल है, इसलिए अब इसके बारे में चिंता न करें। चूंकि आप केवल स्प्राइट शीट के साथ काम कर रहे हैं, अपने आप को GL_CLAMP_TO_EDGE:)


धन्यवाद @AndonMColeman, क्या आप बॉर्डर को आरेख में दिखा सकते हैं क्योंकि मुझे अभी भी यकीन नहीं है कि मैं समझता हूं कि यह कैसे काम करता है - फिर से इसका मतलब यह होगा कि जब बनावट को मेरी वस्तु पर लागू किया जाता है तो इसमें सीमा शामिल होगी? मैं चाहता हूं कि वास्तविक बनावट मेरे क्वाड के किनारों पर सही जाए - माफ करना अगर मैं इसे सही तरीके से नहीं समझ रहा हूं - तो कुछ और विवरणों की सराहना करूंगा - धन्यवाद
BumpBonce

@ user22241 निश्चित रूप से, यह सीमा जिस तरह से काम करती है वह टेक्सल को बनावट के किनारे पर डुप्लिकेट करके है।
एंडॉन एम। कोलमैन

@ user22241: नहीं, यह सीमा सामान्य परिस्थितियों में दिखाई नहीं देगी। आप बनावट के समन्वय की गणना के लिए समान आयाम वाले अपने पैक्ड टेक्सचर्स का इलाज करेंगे, आप बस सीमा पार करने के लिए उन पर एक ऑफसेट लागू करते हैं। सीमा का पूरा बिंदु रेखीय बनावट के नमूने को ओवर-पहुंच और सैंपलिंग टेक्सल्स से रोकना है जो आपकी स्प्राइट शीट में अलग-अलग छवियों से संबंधित हैं। यदि आप निकटतम पड़ोसी नमूने का उपयोग करते हैं, तो इनमें से कोई भी आवश्यक नहीं है, लेकिन फिर आपको गंदा उबले हुए स्प्राइट मिलते हैं।
एंडॉन एम। कोलमैन

शानदार ढंग से विस्तृत जवाब - धन्यवाद! बस एक आखिरी बात अगर मैं कर सकता था। मैं अपनी बनावट निर्देशांक में जोड़ने के लिए 'ऑफसेट' कैसे काम करूंगा? क्या मैं यह कहने में सही हूं कि यह केवल 1 / चौड़ाई होगा।
जंगलबोनस

@ user22241: हां, बनावट छवि की शुरुआत X दिशा में + 1 / widthOfTexture और Y दिशा में + 1 / heightOfTexture होगी। आपके पास एक सीमा होगी जो प्रत्येक बनावट के चारों ओर जाती है। जब तक आप 3 क्षैतिज बनावट के लिए बनावट के निर्देशांक की गणना करना चाहते हैं, तब तक इस बनावट के लिए पैक स्थान वास्तव में +5 टेक्सल्स (पहली बनावट की सीमा के लिए +2 टेक्सल्स), दूसरी बनावट की सीमा के लिए +2 और शुरुआत के लिए +1 है। इस बनावट की) अन्य 2 बनावट की चौड़ाई के अलावा। यह सिर्फ इसे लिखना जटिल लगता है; जरूरत पड़ने पर मैं आपको एक चित्र बना सकता हूं :)
एंडोन एम। कोलमैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.