बनावट एटलस और आसन्न टेक्सल्स का उपयोग करने के साथ समस्या यह है कि रैखिक बनावट को छानने के तरीके के साथ क्या करना है।
बनावट में किसी भी बिंदु के लिए, जो एक टेक्सल के केंद्र में बिल्कुल नमूना नहीं है, रैखिक नमूना 4 आसन्न टेक्सल्स का नमूना लेगा और आपके द्वारा पूछे गए स्थान पर मूल्य की गणना करेगा (नमूना बिंदु से दूरी के आधार पर) सभी 4 के औसत। नमूने हैं।
यहाँ समस्या का एक अच्छा दृश्य है:
चूंकि आप GL_CLAMP_TO_EDGE
बनावट एटलस में कुछ उपयोग नहीं कर सकते हैं , इसलिए आपको प्रत्येक बनावट के किनारे के आसपास बॉर्डर टेक्सल्स बनाने की आवश्यकता है। ये बॉर्डर टेक्सल्स ऊपर बताए गए भारित प्रक्षेप के माध्यम से पड़ोसी नमूनों को पूरी तरह से अलग-अलग बनावट से एटलस में बदलने से रोकेंगे।
ध्यान दें कि जब आप अनिसोट्रोपिक फ़िल्टरिंग का उपयोग करते हैं, तो आपको सीमा की चौड़ाई बढ़ाने की आवश्यकता हो सकती है। ऐसा इसलिए है क्योंकि अनिसोट्रोपिक फ़िल्टरिंग चरम कोण पर नमूना पड़ोस के आकार को बढ़ाएगा।
प्रत्येक बनावट के किनारे के चारों ओर एक सीमा का उपयोग करके मेरा क्या मतलब है, यह स्पष्ट करने के लिए, ओपनजीएल में उपलब्ध विभिन्न रैप मोड पर विचार करें। पर विशेष ध्यान दें CLAMP TO EDGE
।
"क्लैम्प टू बॉर्डर" नामक एक मोड होने के बावजूद, वास्तव में वह नहीं है जिसमें हम रुचि रखते हैं। यह मोड आपको किसी भी बनावट के लिए एक सीमा के रूप में उपयोग करने के लिए एक एकल रंग को परिभाषित करने देता है जो सामान्यीकृत [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
:)
GL_NEAREST
या कर रहे हैंGL_LINEAR
?