ओपनगेल - क्यूब्स पर सफेद किनारों


12

मैं कर रहा हूँ एक Minecraft की तरह खेल में, मैं अपने क्यूब्स पर सफेद किनारों मिलता है:

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

यह गहरे रंग की बनावट में अधिक ध्यान देने योग्य है। बनावट इस तरह से सेटअप की जा रही है: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

कोई मदद?


3
क्या आप कुछ कोड दिखा सकते हैं कि आप प्रत्येक क्यूब को कैसे प्रस्तुत करते हैं और आप क्यूब्स को कैसे रखते हैं?
joncodo

1
क्या बनावट को लपेटने से कुछ अलग होता है? बनावट कैसी दिखती है / आकार जो आप के लिए बाध्य है?
चक डी

मैं सिर्फ यह बताना चाहता था कि मैंने यह देखा है कि यह बड़े बनावट वाले एटलस में भी होता है, जो छोटी टाइलों का उपयोग करते हैं। एक उदाहरण के रूप में, मान लें कि आपके पास 1024 * 1024 टाइलसेट / एटलस है, और आपकी 32 * 32 की टाइल्स का उपयोग कर रहे हैं। आपको गोल त्रुटियां मिलती हैं क्योंकि दशमलव बिंदु जो कहा जाता है कि टाइल बहुत छोटा है। यह असंभव के पास सटीक बनाता है। एक तरकीब? व्यक्तिगत टाइलों में टाइल एटलस को तोड़ें। यह वही है जो Minecraft करता है, या करता था। उनके पास एक बड़ी टाइल थी, और रनटाइम में उन्होंने इसे अलग-अलग बनावट में काट दिया।
क्रीथिक

जवाबों:


19

इस प्रकार की समस्या के दो संभावित कारण हैं, यह वास्तव में किस समस्या पर निर्भर करता है। मैं दोनों की सूची दूंगा:

1. आप टाइल्स के किनारों के साथ अपनी बनावट से अन्य रंगों को देख रहे हैं।

यह मुझे इस मामले में समस्या की तरह लग रहा है, क्योंकि सभी किनारे के पिक्सल तीन रंगों में से एक हैं जो आपकी बनावट में काफी हैं: सफेद, काला और भूरा।

यदि आप एक ही बनावट (एक बनावट एटलस) में एक-दूसरे के ठीक बगल में कई टाइल की छवियों का उपयोग कर रहे हैं, जैसा कि मैं मानता हूं कि आप कर रहे हैं, तो यह अपरिहार्य है। यह तब होता है क्योंकि GPU पूरी तरह से एक त्रिकोण के किनारे पर बनावट के साथ प्रक्षेप के साथ मेल नहीं खाता है, और आपको आसन्न बनावट के छोटे टुकड़े मिलते हैं।

कई चीजें हैं जो आप कर सकते हैं।

  • एक बनावट एटलस के बजाय एक सरणी बनावट का उपयोग करें । एक सरणी बनावट एक ही आकार के 2 डी छवियों के ढेर से बना है, और आप एक का चयन करने के लिए एक तीसरा समन्वय निर्दिष्ट करते हैं; यह वास्तव में फ़िल्टरिंग समस्या के बिना बनावट atlases के प्रतिस्थापन के रूप में करना है। हालाँकि, सरणी बनावट एक नई सुविधा है जिसका उपयोग आप OpenGL के संस्करण में नहीं कर सकते हैं।
  • अपनी प्रत्येक बनावट टाइल में 1-पिक्सेल बॉर्डर बनाएं, जो आसन्न नियमित पिक्सेल के रंग को दोहराता है। (यह अनिवार्य रूप से जीएल के पुन: क्रियान्वयन है CLAMP[_TO_EDGE], लेकिन एक तरह से जो बनावट atlases के बारे में जानते हैं - आपके उपयोग का कोई प्रभाव नहीं है क्योंकि आपके अधिकांश टाइल किनारे बनावट के किनारे पर नहीं हैं।) यह वह समाधान है जिसका उपयोग मैं अपनी प्रविष्टि में करता हूं। शैली में, क्यूब्स । मुझे कोई विशेष नुकसान नहीं है सिवाय इसके कि यह अधिक बनावट स्मृति का उपयोग करता है।
  • बहुत थोड़ा इनसेट आपकी बनावट को समन्वयित करता है, जिससे वे बनावट टाइल के किनारे तक नहीं जाते हैं। इसे बहुत अधिक करने से बीच के पिक्सल की तुलना में बनावट के किनारों का ध्यान देने योग्य पतलापन होगा।
  • प्रति टाइल प्रकार एक एकल बनावट का उपयोग करें। यह बनावट-स्विचिंग लागत लगाता है।

2. आप टाइल्स के बीच अंतराल के माध्यम से देख रहे हैं।

मुझे नहीं लगता कि इस मामले में यह समस्या है, क्योंकि अंतराल के माध्यम से कोई हरा मैदान नहीं देखा गया है, लेकिन मैं इसे पूर्णता के लिए शामिल कर रहा हूं।

यह तब हो सकता है जब आप प्रदान नहीं कर रहे वास्तव में आसन्न टाइल्स की बैठक किनारों, जो आमतौर पर फ्लोटिंग प्वाइंट त्रुटि के कारण पैदा होती है के कोने के लिए एक ही निर्देशांक। उदाहरण के लिए, आप आकार 0.6 की टाइल्स अगर और कम से टाइल के दाएं किनारे की गणना x=100के साथ (100*0.6) + 0.6, और कम से टाइल के बाईं बढ़त x=101के साथ (100*0.6), आप ठीक उसी जवाब नहीं मिल जाएगा, और अंतर के छोटे specks के रूप में देखा जा सकता है अंतराल।

समाधान यह सुनिश्चित करना है कि आपका अंकगणित सुसंगत है; ऐसा करने के कुछ तरीके हैं:

  • सुनिश्चित करें कि आप (अप्रत्यक्ष रूप से) कंप्यूटिंग नहीं हैं index*size + size, लेकिन केवल (index+1)*size
  • सुनिश्चित करें कि आपका अंकगणित सटीक है; इसका सबसे आसान तरीका यह है कि आपके टाइल का आकार ठीक 1.0 बनाया जाए, जिसके परिणामस्वरूप सटीक पूर्णांक अंकगणित होगा, भले ही आप अपनी गणना 32-बिट फ़्लोट्स (मूल से 16 मिलियन ब्लॉक, वैसे भी) के साथ करें।
  • शीर्ष समन्वय गणना के लिए वास्तविक पूर्णांक का उपयोग करें; यह आपको और भी अधिक रेंज में मिलता है।

मेरे लिए अंतराल जैसा दिखता है - छोटे और तेज बिट्स पर विचार करते हुए कोई बनावट रक्तस्राव (जब तक कि यह काफी उच्च बनावट नहीं है)।
मारियो

धन्यवाद, बनावट को समेटते हुए बिट द्वारा निर्देशांक इसे ठीक करने के लिए लगता है।
लुइस क्रूज़

@ मेरा मानना ​​है कि यह NEAREST आवर्धन के साथ है - टाइल के इंटीरियर पर तेज सीमा पर ध्यान दें। तो उस दृष्टिकोण के लिए, यह एक अनंत संकल्प बनावट है।
केविन रीड

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