2009-08-06 9 views
8

चूंकि ओपनजीएल एक राज्य मशीन है, इसलिए मैं अपने कार्यक्रम में लगातार glEnable() और glDisable() - ing चीजें बना रहा हूं। कुछ चुनिंदा कुछ कॉल हैं जिन्हें मैं केवल शुरुआत में ही करता हूं (जैसे ग्लक्लेरकॉलर) लेकिन अधिकांश अन्य मैं फ्लिप करता हूं (प्रकाश की तरह, अगर मैं मॉडल या 3 डी टेक्स्ट या गुई प्रस्तुत कर रहा हूं)।फ़ंक्शन कॉल में ओपनजीएल राज्य का ट्रैक कैसे रखें?

आप किस राज्य की चीज़ों का ट्रैक रखते हैं? क्या आप इन कार्यों के शीर्ष पर इन चीजों को लगातार सेट/रीसेट करते हैं? क्या वह बहुत अनावश्यक ओवरहेड नहीं है?

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

ऑब्जेक्ट उन्मुख वातावरण में ओपनजीएल के कार्यों में आप कैसे ट्रैक करते हैं?


इस प्रश्न से संबंधित, यह जानने के लिए कि कैसे पुश और पॉप का उपयोग करना है, और मूल्य को कब सेट करना है।

उदाहरण के लिए, मान लें कि आपके पास एक ऐसा प्रोग्राम है जो कुछ 3 डी सामान खींचता है, फिर कुछ 2 डी सामान खींचता है। जाहिर है प्रत्येक मामले में प्रक्षेपण मैट्रिक्स अलग है। तो अगर आप कार्य करें:

  1. एक 3 डी प्रक्षेपण मैट्रिक्स, 3 डी आकर्षित, एक 2d प्रक्षेपण मैट्रिक्स की स्थापना की, आकर्षित 2 डी, पाश
  2. कार्यक्रम में एक 3 डी प्रक्षेपण मैट्रिक्स की स्थापना की स्थापना; फिर 3 डी ड्रा, पुश मैट्रिक्स, ड्रा 2 डी, पॉप मैट्रिक्स, लूप

और क्यों?

उत्तर

2

शानदार सवाल। इस बारे में सोचें कि बनावट कैसे काम करती है। ओपनजीएल के बीच स्विच करने के लिए एक पागल मात्रा में बनावट हैं, और के बाद आपको ऑब्जेक्ट खींचा जाने के बाद टेक्स्टिंग को सक्षम/अक्षम करने की आवश्यकता है। आप आम तौर पर एक ही बनावट के साथ सभी ऑब्जेक्ट्स को एक साथ बनाकर इसे अनुकूलित करने का प्रयास करते हैं, लेकिन अभी भी एक उल्लेखनीय मात्रा में राज्य-स्विचिंग चल रही है। इस तथ्य के कारण, मैं एक ही राज्य के साथ एक ही समय में सबकुछ आकर्षित करने के लिए अपनी पूरी कोशिश करता हूं, लेकिन मुझे यकीन नहीं है कि आप जिस तरीके से सोच रहे हैं उसे अनुकूलित करने के लिए यह बहुत महत्वपूर्ण है।

3 डी और 2 डी प्रक्षेपण मोड के बीच धक्का और पॉपिंग के रूप में, धक्का और पॉपिंग का उद्देश्य पदानुक्रमित मॉडलिंग के लिए उपयोग किया जाना है। यदि आपको किसी 3 डी ऑब्जेक्ट के सापेक्ष किसी स्थान पर होने के लिए 2 डी प्रक्षेपण की आवश्यकता है, तो हर तरह से, मैट्रिक्स को दबाएं और 2 डी प्रक्षेपण मोड पर स्विच करें, फिर जब आप पूरा कर लें तो पॉप करें। हालांकि, यदि आप एक 2 डी जीयूआई ओवरले लिख रहे हैं जिसमें स्क्रीन पर निरंतर स्थान है, तो मुझे कोई कारण नहीं दिख रहा है कि पुशिंग और पॉपिंग क्यों महत्वपूर्ण है।

+0

अच्छी तरह से मुझे यकीन नहीं है कि आपका पहला पैराग्राफ वास्तव में इस मुद्दे को संबोधित करता है, हालांकि मुझे यकीन है कि यह काफी हद तक है क्योंकि मैंने खुद को पर्याप्त रूप से समझाया नहीं है। मुझे इस सवाल पर वापस आने की जरूरत है जब मेरे पास बिल्कुल पूछने का एक स्पष्ट विचार है कि मैं क्या पूछने की कोशिश कर रहा हूं। हालांकि पुश/पॉप पर अंतर्दृष्टि के लिए धन्यवाद, मुझे वह स्पष्टीकरण पसंद है। – Ricket

2

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

http://www.realityprime.com/articles/scenegraphs-past-present-and-future

+0

हां, मैं उनके साथ काफी परिचित हूं। मैं जावा का उपयोग कर रहा हूं, इसलिए Xith3D और jMonkeyEngine है। समस्या यह थी कि मैंने इन इंजनों पर जुनून लगाया और वास्तव में कुछ भी सार्थक नहीं बनाया। अब जब मैं सिर्फ शुद्ध ओपनजीएल लिख रहा हूं, तो मुझे वास्तव में सामान मिल रहा है। हालांकि धन्यवाद। – Ricket

+0

ऐसा लगता है कि आप पहिया को फिर से खोज रहे हैं। आपने जो कुछ हासिल किया है वह पहले से ही एक दृश्य ग्राफ लाइब्रेरी द्वारा प्रबंधित किया गया था? बाउंडिंग बॉक्स गणना के साथ – Eric

+1

.ms3d फ़ाइल लोडर। शायद यह इसके बारे में है। मैं एक दृश्य ग्राफ लाइब्रेरी के साथ क्या नहीं कर सकता, कम से कम आसानी से, मेरा विशेष ऊंचाई (योजनाबद्ध गतिशील लोडिंग के साथ) और मेरी कस्टम जीयूआई विशेषताएं है। तो हाँ यह एक ट्रेडऑफ है, लेकिन मेरे लिए चीजों को लिखना आसान है, एक दृश्य ग्राफ लाइब्रेरी क्या कर सकती है और फिर अन्य चीजें जो इसे नहीं कर सकती हैं, बजाय एक का उपयोग करने के लिए और वर्कअराउंड और हैक को समझने की कोशिश करने के लिए स्क्रीन या कुछ पर 2 डी आकार। – Ricket

2

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

संबंधित मुद्दे