OpenGL: VBO या glBegin () + glEnd ()?


16

मुझे हाल ही में यह लिंक एक ट्यूटोरियल साइट से दिया गया था, जिसे मैंने ओजीएल रेडबुक को दिया था। नीचे तीसरा शीर्षलेख विशिष्ट रेंडर विधि के रूप में glBegin () और glEnd () को भूलने के लिए अलग से कहता है। मैंने रेडबुक की विधि के माध्यम से सीखा, लेकिन मुझे वीबीओ में कुछ लाभ दिखाई देता है। क्या यह वास्तव में जाने का तरीका है, और यदि ऐसा है, तो क्या रेंडर कोड और बाद के शेड्स को आसानी से वीबीओ और बाद के डेटाटिप्स में बदलने का कोई तरीका है?

जवाबों:


27

आधुनिक ओपनजीएल के वीबीओ के साथ जाने का तरीका है, फिक्स्ड फंक्शन सामान (ग्लबीगिन / ग्लैंड और बीच में सामान सहित) 3.0 से हटा दिया गया है और 3.1 से हटा दिया गया है।

OpenGL कोर प्रोफाइल, OpenGL ES 2.0+ और WebGL के साथ आपके पास पुराने सामान तक पहुंच भी नहीं है।

कुछ लोग सोचते हैं कि पुराने सामान को सीखना पहले बेहतर है क्योंकि यह थोड़ा आसान है, लेकिन जो चीजें आप सीखते हैं वह ज्यादातर बेकार है और फिर सामान को आपको अनजान करना होगा।

यह सिर्फ वीबीओ का नहीं है, आपको हर चीज के लिए शेड का उपयोग करने की जरूरत है और मैट्रिक्स खुद को बदल देता है (या जीएलएम का उपयोग करता है)।

यदि आप 2.0 से पहले ओपनजीएल को लक्षित करना चाहते हैं तो पुराने सामान का उपयोग करने का एकमात्र कारण होगा। जो 2003 में वापस आया था। कुछ वास्तव में भद्दे एम्बेडेड नेटबुक चिपसेट हैं जो 1.5 हैं लेकिन यहां तक ​​कि 1.5 को वीबीओ का समर्थन करना चाहिए न कि केवल शेडर्स। या OpenGL ES 1.x जो निश्चित फ़ंक्शन पाइपलाइन पर आधारित है (उदाहरण के लिए पुराने iPhones पर इसका उपयोग किया जाता है)। या ओपनजीएल एससी (सुरक्षा महत्वपूर्ण प्रणालियों के लिए)।

आमतौर पर उपयोग किए जाने वाले कार्य निम्नलिखित हैं:

  • glBegin
  • glEnd
  • glVertex *
  • glNormal *
  • glTextCoord *
  • glTranslate *
  • glRotate *
  • glScale *
  • glLoadIdenity
  • glModelViewMatrix

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

हटाए गए सामान से बचने के अलावा, फ़ंक्शंस का एक समूह है जो ओपनिंग कोडिंग को बहुत अच्छे बनाता है, लेकिन उनमें से कई के साथ आपको यह तय करना होगा कि क्या आपको ओपनजीएल के नए 3.x + संस्करणों और संगत हार्डवेयर की आवश्यकता है।

मेरे द्वारा यहां की गई पोस्ट में अधिक जानकारी है

यदि आपको किसी कारण से पुराने OpenGL का समर्थन करने की आवश्यकता है, तो आप जब संभव हो तो VBO का उपयोग कर सकते हैं और जब यह नहीं होता है, तो एक ग्लबैक प्रदान करें जो आपके वर्टेक्स डेटा में glBegin / glEnd और लूप का उपयोग करता है।

दूसरी ओर, पुराने रेंडर कोड को बढ़ाने के लिए कोई वास्तविक 'आसान' तरीका नहीं है। आप संभवतः फ़ंक्शन के अपने स्वयं के संस्करण को लागू कर सकते हैं जो एक सरणी / वेक्टर में कोने जोड़ते हैं जो फिर इसे VBO में डंप करता है और जब आप नकली glEnd कहते हैं, तो इसे खींचता है। लेकिन यह बहुत ही अयोग्य होगा क्योंकि यह हर फ्रेम में होगा (जब तक कि आप केवल एक बार इसे करने के लिए जांच में नहीं डालते हैं लेकिन यह एनिमेटेड ऑब्जेक्ट्स के लिए काम नहीं करता है) और शायद अधिक काम होगा जो सिर्फ वीबीओ पर स्विच कर रहा है। मुझे लगता है कि अगर आपके पास बहुत सारे कोड होते हैं जो दृष्टिकोण काम कर सकते हैं।


7

VBOs के साथ आप आम तौर पर दो प्रमुख फायदे हैं।

लाभ 1 पूरी तरह से स्थिर डेटा से संबंधित है और यह मेमोरी में आपके वर्टेक्स डेटा को रखने में सक्षम है जो कि GPU के लिए अधिक इष्टतम है।

एडवांटेज 2 डायनेमिक डेटा से संबंधित है और इसे रेंडर करने के लिए उपयोग करने से पहले किसी भी समय अपने वर्टेक्स डेटा को निर्दिष्ट करने में सक्षम होने से आता है, जो बेहतर पाइपलाइन कर सकता है।

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

एक अच्छा (100% सटीक नहीं है लेकिन आपको विचार प्राप्त करने में मदद करने के लिए पर्याप्त है) इसके लिए सादृश्य है यदि आप एक बस चालक हैं जिसे 50 लोगों को एक शहर से दूसरे शहर में लाना है। आप उन्हें एक समय में एक लोड कर सकते हैं और 50 अलग-अलग यात्राएं कर सकते हैं - यह glBegin / glEnd है। वैकल्पिक रूप से आप उनमें से सभी 50 को बस में रख सकते हैं और बस एक ही यात्रा कर सकते हैं - जो कि वर्टेक्स एरेज़ या वीबीओ के साथ बैचिंग है (वीबीओ मामले में 50 लोग पहले से ही बस में होंगे;))।

यह हालांकि एक मूल्य पर आता है, और यहाँ कीमत यह है कि जब आप आवश्यकता के रूप में केवल शीर्ष डेटा को निर्दिष्ट करने की क्षमता खो देते हैं। ठीक है, ठीक है, आप ऐसा कर सकते हैं (कुछ अतिरिक्त काम के साथ), लेकिन आपको अपने कोड से पूर्ण प्रदर्शन नहीं मिलेगा। इसके बजाय आपको अपने शीर्ष डेटा के बारे में अधिक सोचने की ज़रूरत है कि इसका उपयोग कैसे, कैसे (और अगर) इसे अपडेट करने की आवश्यकता है, क्या किसी shader में कोई एनिमेशन किया जा सकता है (इस प्रकार डेटा को स्थिर बने रहने में सक्षम होना चाहिए - VBOs को वास्तव में shaders की आवश्यकता है एनिमेशन के बहुत से मामले अच्छी तरह से काम करने के लिए) या क्या आपको प्रत्येक फ्रेम में वर्टेक्स डेटा को रिस्पेक्ट करने की आवश्यकता है, यदि बाद में, आदि के लिए कुशल अपडेट स्ट्रैटेजी, यदि आप ऐसा नहीं करते हैं और सिर्फ एक भोले रूपांतरण को लागू करते हैं, तो आपके पास डालने का बहुत अधिक जोखिम है। वास्तव में धीमी गति से चलाने के लिए अंतिम परिणाम के लिए बहुत सारे काम में!

जब आप इसे पहली बार सामना करते हैं तो यह एक भयानक काम की तरह लग सकता है, लेकिन यह वास्तव में नहीं है। एक बार जब आप इस तरह की सोच में पड़ जाते हैं, तो आप वास्तव में पाएंगे कि यह अविश्वसनीय रूप से आसान है और लगभग स्वाभाविक रूप से आता है। लेकिन आप अपने पहले कुछ प्रयासों को खराब कर सकते हैं और यदि आपको ऐसा नहीं करना है, तो आपको निराश नहीं होना चाहिए - आपने जो गलत किया, उससे सीखने का अवसर है।

कुछ अंतिम विचार।

एक प्रारूप में अपने मॉडल डेटा को VBO में आसानी से लोड किया जा सकता है, इस पूरी प्रक्रिया को आपके लिए बहुत आसान बनाने में मदद कर सकता है। इसका मतलब है कि आपको अधिक जटिल या विदेशी प्रारूपों से बचना चाहिए, कम से कम पहले (और जब तक आप प्रक्रिया के साथ अधिक सहज नहीं हो जाते); सीखने के दौरान चीजों को जितना संभव हो उतना सरल और बुनियादी रखें और गलत चीजों को कम करना होगा, और अगर (या जब!) चीजें गलत होने पर कम स्थानों को देखना होगा।

लोगों को कभी-कभी बंद कर दिया जाता है अगर वे एक अनुकूलित / संपीड़ित glBegin / glEnd कार्यान्वयन की तुलना में अधिक मेमोरी का उपयोग करके VBO कार्यान्वयन देखते हैं (वे इसे "बेकार" भी कह सकते हैं)। उस तरह मत बनो। चरम मामलों को छोड़कर, स्मृति उपयोग वास्तव में उतना महत्वपूर्ण नहीं है । यह यहाँ एक स्पष्ट व्यापार है - आप काफी अधिक प्रदर्शन के बदले में संभावित उच्चतर स्मृति उपयोग स्वीकार कर रहे हैं। यह भी मानसिकता विकसित करने में मदद करता है कि स्मृति एक सस्ता और भरपूर संसाधन है जिसका उपयोग किया जाना है; प्रदर्शन नहीं है।

और अंत में पुरानी चेस्टनट - यदि यह पहले से ही काफी तेज है तो आपका काम हो गया है। यदि आप अपने लक्ष्य को तोड़ रहे हैं, यदि आपके पास क्षणिक परिस्थितियों के लिए हेडरूम है, तो यह काफी अच्छा है और आप अगले कदम पर आगे बढ़ सकते हैं। आप बहुत अधिक समय और ऊर्जा को बर्बाद कर सकते हैं, जिसमें से 10% अतिरिक्त चीज को निचोड़ना है, जिसकी वास्तव में आवश्यकता नहीं है (वहाँ किया गया है, जो अभी भी जाल में है) तो हमेशा इस बात पर विचार करें कि आपके अपने समय का सबसे इष्टतम उपयोग क्या है - क्योंकि प्रोग्रामर का समय प्रदर्शन से भी कम सस्ता और कम बहुतायत से है!

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