opengl es ओपनजीएल क्लिपिंग



opengl-es clipping (1)

मैं अब घंटों के लिए अब क्लिपिंग के बारे में लेख पढ़ रहा हूं, लेकिन मुझे मेरी समस्या का समाधान नहीं मिल रहा है।

यह मेरा परिदृश्य है:

ओपनजीएल ईएस वातावरण (आईओएस, एंड्रॉइड) में एक पेड़ बनाने के लिए, मुझे ड्रॉबल ऑब्जेक्ट्स वाला 2 डी दृश्य ग्राफ़ होता है

प्रत्येक पेड़ के नोड के अपने स्वयं के स्थानिक कक्ष हैं, यह स्वयं के रूपांतरण मैट्रिक्स के साथ है, और प्रत्येक नोड अपने बच्चों के लिए इसके समन्वय स्थान को संभालता है। प्रत्येक नोड में एक आयताकार बाउंडिंग बॉक्स होता है, लेकिन ये बाउंडिंग बक्से अक्ष अक्षरों को नहीं जोड़ते हैं।

यह सेटअप एक 2 डी दृश्य ग्राफ़ को प्रस्तुत करने के लिए एकदम सही काम करता है, वृक्ष के माध्यम से चलती है, प्रत्येक ऑब्जेक्ट को प्रतिपादन करता है और फिर यह बच्चे हैं

अब मेरी समस्या आता है: मैं एक नोड पर क्लिपिंग को सक्षम करने के लिए एक तरफ़ देख रहा हूं। कतरन सक्षम होने पर, माता-पिता के बाउंडिंग बॉक्स के क्षेत्र को छोड़ते समय एक नोड के बच्चों का काटा होना चाहिए।

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

चूंकि बाउंडिंग बक्से धुरा गठबंधन नहीं हैं, इसलिए मैं glScissor का उपयोग नहीं कर सकता, जो सबसे आसान तरीका होगा।

मैं स्टैंसिल बफर का उपयोग करने के बारे में सोच रहा था और उसमें भरे हुए सीमा आयताकार आकर्षित करता था, जब कतरन सक्षम होता है और फिर स्टैंसिल बफर को सक्षम करता है। यह काम कर सकता है, लेकिन एक और समस्या की ओर जाता है: क्या होता है अगर एक क्लैंप नोड के अंदर एक बच्चा फिर से कतरन कर रहा है? - बच्चे के लिए स्टैंसिल मुखौटा तैयार करना होगा, माता-पिता स्टैंसिल मुखौटा मिटा देना।

मैं सोच रहा था कि एक अन्य समाधान, सॉफ्टवेयर में कतरन करना है यह संभव होगा, क्योंकि प्रत्येक नोड के भीतर, यह अपने स्थानीय समन्वय स्थान में क्लिपिंग को आसानी से सापेक्ष किया जा सकता है। इस समाधान का आधार होगा कि प्रत्येक नए नोड प्रकार के कार्यान्वयन के लिए कतरन कार्यान्वित किया जाना चाहिए।

क्या कोई मुझे सही दिशा में इंगित कर सकता है? मैं क्या देख रहा हूँ, गैर अक्ष गठबंधन आयताकार क्षेत्रों को क्लिप करने के लिए glscissor की कार्यक्षमता की तरह कुछ है।


कैंची बॉक्स सरल जरूरतों के लिए एक सरल उपकरण है यदि आपके पास कम सरल ज़रूरतें हैं, तो आपको कतरन के लिए कम सरल ओपनजीएल तंत्र का उपयोग करना होगा: स्टैंसिल बफर

यह मानते हुए कि आप वर्तमान में किसी और चीज़ के लिए स्टैंसिल बफर का उपयोग नहीं कर रहे हैं, आपके पास 8 स्टैंसिल बिट्स तक पहुंच है। अपने दृश्य में प्रत्येक स्तर को अंतिम से अधिक उच्च संख्या प्रदान करके, आप प्रत्येक स्तर को अपनी स्टैंसिल मुखौटा प्रदान कर सकते हैं। बेशक, अगर एक ही गहराई के स्तर पर दो भाई-बहन ओवरलैप होते हैं, या बस बहुत करीब हैं, तो आपको एक समस्या है।

एक और विकल्प है प्रत्येक नोड को एक संख्या 1 से 255 तक असाइन करना है। GL_EQUAL की स्टैंसिल परीक्षण का उपयोग करते हुए, आप उपर्युक्त समस्या को ऊपर से रोक सकते हैं। हालांकि, इसका मतलब है कि आपके पूरे दृश्य ग्राफ़ में 255 से अधिक नोड्स हो सकते हैं। आपकी विशेष जरूरतों के आधार पर, यह बहुत ज्यादा प्रतिबंध हो सकता है।

आप निश्चित रूप से स्टैंसिल (और गहराई) को साफ़ कर सकते हैं। जब आप किसी भी विधि के माध्यम से बिट्स से बाहर निकलते हैं लेकिन यह कुछ महंगा हो सकता है, और इसकी आवश्यकता है कि आप गहराई को साफ़ करें, जिसे आप नहीं करना चाहते।

एक अन्य विधि केवल गैर-अक्ष-संरेखित नोड्स के लिए बढ़ती संख्या और GL_EQUAL परीक्षण का उपयोग करना है। आप अधिकतर नोड्स के लिए कैंची बॉक्स का उपयोग करते हैं, लेकिन यदि कुछ रोटेशन (चाहे वह नोड या विरासत में हो) है, तो आप इसके बजाय स्टैंसिल मुखौटा का उपयोग करते हैं, जैसे कि ग्राफ़ की प्रक्रिया करते समय मुखौटा काउंटर को दबाकर। फिर, आप 256 नोड्स तक सीमित हैं, लेकिन कम से कम ये केवल घुमाए गए नोड्स के लिए हैं आपकी ज़रूरतों के आधार पर और कितने घुमाए गए नोड्स हैं, जो कि पर्याप्त हो सकते हैं