OpenGL में "बफर" और "एरे" के बीच अंतर?


12

जब मैं webGL या OpenGL पर डॉक्टर को पढ़ता हूं तो कुछ पैटर्न देखे जा सकते हैं कि कार्यों और वस्तुओं के नाम कैसे उपयोग किए जाते हैं। लेकिन मैं बफर ऑब्जेक्ट और एरे के बीच के अंतर को नहीं समझ सकता।

"वर्टेक्स बफर ऑब्जेक्ट्स", "वर्टेक्स एरे ऑब्जेक्ट्स" और यहां तक ​​कि किसी तरह के "बफर ऐरे ऑब्जेक्ट्स" या "एरेबफ़र" भी हैं।

ओपनजीएल संदर्भ में, जब कुछ "सरणी" होता है और जब इसे "बफर" कहा जाना चाहिए?


कुछ परिप्रेक्ष्य, नेटवर्क पर डेटा लाने और प्राप्त की गई सभी चीज़ों के लॉग को संग्रहीत करने के बारे में सोचते हैं। आपको सॉकेट को पढ़ने और प्राप्त डेटा को कहीं रखने की आवश्यकता है ताकि आप इसे पास कर सकें, यह एक बफर है। यह अक्सर स्थानीय रूप से स्कोप हो सकता है, गतिशील रूप से आवंटित सरल सूची प्रकार। कभी-कभी यह char* buffer = socketRead();(pseudocode) जितना ही सरल होता है । दूसरी ओर लॉग, पूरे ऐप जीवनचक्र के माध्यम से रहता है। तो आप कहीं भी एक सरणी बनाएं और सॉकेट को पढ़ना शुरू करें, कभी भी आपको जो डेटा मिलता है, उस सरणी को आप लिख देते हैं, जिससे आपको प्राप्त सभी डेटा की एक साफ सूची मिलती है।
केविन

जवाबों:


5

वर्टेक्स एरे ऑब्जेक्ट का नामकरण कुछ दुर्भाग्यपूर्ण है। आपके आवेदन के अंदर / साथ / दिखाई देने वाली (दिखाई देने वाली), या जो (हैं, ऐतिहासिक रूप से) अलग-अलग नाम से "सरणी" या "बफर" के साथ (अच्छी तरह से, फ्रेमबफ़र ऑब्जेक्ट्स भी हैं) में तीन अलग-अलग चीजें दिखाई देती हैं। लेकिन मैं इसे अनदेखा करूंगा)।

  1. डेटा जो औपचारिक रूप से और तथ्यात्मक रूप से आपके आवेदन में रहता है, लेकिन जिसे ओपनजीएल द्वारा एक बार में खींचा जाता है (जैसा कि वर्टेक्स-बाय-वर्टेक्स के विपरीत)। यह एक समय था जब आप वर्टेक्स ऐरे को कॉल करेंगे ।
    इसका उद्देश्य ओपनिंग को और अधिक कुशल बनाना था क्योंकि ओपनजीएल एक अच्छी तरह से परिभाषित समय में एक बार में पूरी बात की नकल कर सकता है जब आपने वादा किया था कि डेटा संगत था, और इसे एजीपी या एक ब्लॉक में जो भी हो, उस पर पुश करें। यह अब मौजूद नहीं है।
  2. डेटा एक हैंडल द्वारा अस्पष्ट और सुलभ है जो "बाध्य" हो सकता है, अर्थात सक्रिय किया गया है। डेटा मुख्य रूप से मुख्य मेमोरी में, या ग्राफिक्स कार्ड पर रह सकता है , या PCIe-mappable क्षेत्र में ले जाया जा सकता है, जो भी हो, लेकिन किसी भी तरह से आप औपचारिक रूप से स्वयं नहीं हैं (भले ही यह शारीरिक रूप से RAM में हो और यदि डेटा आपके एप्लिकेशन से आया हो ) यह - जब तक कि आप वर्तमान में संबंधित एपीआई के माध्यम से इसे "मैप" नहीं करते हैं, एक रिटेबल (और कभी-कभी पठनीय) पॉइंटर को वापस प्राप्त करता है। आप यह भी नियंत्रित करने की अपनी क्षमता में सीमित हैं कि डेटा में क्या होता है (आप कुछ संकेत दे सकते हैं, लेकिन यह बहुत ज्यादा है)।
    OpenGL इस डेटा को अधिक या कम स्वतंत्र रूप से इधर-उधर ले जा सकता है, और आपको कभी भी संबंधित API के माध्यम से बफर से / से कॉपी करने की अनुमति दी जाती है या डेटा का उपयोग करते समय इसे मैप किया जा सकता है। इसे आप बफर ऑब्जेक्ट कहते हैं (वर्टेक्स बफर ऑब्जेक्ट यदि इसमें वर्टिकल होते हैं, लेकिन यह वास्तव में नहीं है, तो छवि डेटा या वर्दी हो सकता है, केवल वर्टिक्स पहले समर्थित थे, एक बार में एक बार)।
    इसका आशय यह है कि ओपनजीएल (सिद्धांत रूप में) यह गारंटी दे सकता है कि वह क्या चाहता है, यह पीसीआई पर बफर को भी सट्टा लगा सकता है इससे पहले कि आप भी ड्रा करें। वह काम करता है क्योंकि आपके पास डेटा नहीं है (ओपनजीएल करता है!) और आप इसे केवल दिए गए एपीआई के माध्यम से एक्सेस कर सकते हैं, इसलिए यह हर समय ज्ञात है कि डेटा वैध है। ड्राइवर भी ग्राफिक्स कार्ड पर बफर मेमोरी को फेंकने का विकल्प चुन सकता है जब उसे कुछ अलग करने के लिए मेमोरी की आवश्यकता होती है और बाद में जरूरत पड़ने पर इसे उसकी गुप्त कॉपी से पुनर्स्थापित कर देता है।
  3. वास्तव में बेवकूफ मिथ्या नाम जिसके लिए बहुत बेहतर नाम बफर-सेट या डिस्क्रिप्टर-सेट जैसा होगा, यह कुख्यात वर्टेक्स ऐरे ऑब्जेक्ट है । यह, आपके दृष्टिकोण से, एक और अस्पष्ट हैंडल (जिसे आप बांध सकते हैं) के तहत एक साथ बफ़र हैंडल का एक सेट के अलावा कुछ भी नहीं है। जैसा कि होता है, वास्तविकता थोड़ी अधिक जटिल है। वास्तव में, VAO वास्तविक हार्डवेयर कैसे काम करता है, इसके बहुत करीब है। ग्राफिक कार्ड में डिस्क्रिप्टर सेट की एक छोटी संख्या (अक्सर 2, 4 या 8 जैसी कुछ) होती है (न केवल बफ़र्स के लिए, बल्कि प्रत्येक के लिए बहुत सारी प्रविष्टियाँ), जिनके बीच वे बहुत कुशलता से स्विच कर सकते हैं। ।
    अब, वर्टेक्स ऐरे ऑब्जेक्ट का इरादा एपीआई कॉल की संख्या को कम करना और स्थिरता जांच की संख्या को कम करना है जिसे ओपनजीएल को आंतरिक रूप से बनाना चाहिए, और निश्चित रूप से हार्डवेयर का उपयोग करने के लिए। यदि आप 5 बफ़र्स को बाँधते हैं, तो प्रत्येक को कुछ संभावित महंगी जाँचों से गुजरना चाहिए, और हर एक ड्राइवर में कैश मिस के लिए एक उम्मीदवार है, साथ ही प्रत्येक एक को एक वर्णक बदलने के लिए ग्राफिक्स कार्ड के साथ संचार करने की आवश्यकता होती है, आदि आदि यदि आप इसके बजाय। एक VAO को बांधें, ड्राइवर (अक्सर) ग्राफिक्स कार्ड पर सेट किए गए डिस्क्रिप्टर को स्विच कर सकता है, और किया जा सकता है।

8

वर्टेक्स एरे ऑब्जेक्ट (वीएओ) एक ऐसी वस्तु है जिसमें एक या एक से अधिक वर्टेक्स बफर ऑब्जेक्ट होते हैं और यह पूरी तरह से प्रदान की गई वस्तु के लिए जानकारी संग्रहीत करने के लिए डिज़ाइन किया गया है।

( क्रोनोस से खींचा गया )

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

यह एक तरीका है। यह काम कर सकते हैं अन्य तरीके हैं:

  • सभी विशेषताओं को एक एकल बफर में इंटरलेव किया जाता है , या
  • कुछ विशेषताएँ अपने स्वयं के समर्पित बफ़र्स में मौजूद हैं, जबकि अन्य बफ़र्स को साझा करते हैं।

नीचे दिए गए आरेख इन बाद के दो मामलों को दर्शाते हैं।

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

नीचे पंक्ति: यदि वाक्यांश "वर्टेक्स ऐरे" का उपयोग ओपनजीएल में अयोग्य के रूप में किया जाता है, तो आप मान सकते हैं कि इसका मतलब VAO है, जो कि ओपनजीएल संदर्भ में (विशेष रूप से) एक बफर से वास्तव में बहुत अलग चीज है।

EDIT आपकी टिप्पणी को फिर से GL_ARRAY_BUFFERबताता है: ऊपर वर्णित के रूप में, शीर्ष विशेषता डेटा के लिए उस बफर ऑब्जेक्ट का उपयोग करने के इरादे को इंगित करता है। ऐसा इसलिए है क्योंकि बफ़र्स का उपयोग केवल शीर्ष विशेषता के लिए नहीं किया जाता है । हालांकि, जैसा कि यह सबसे आम उपयोग-मामला है और आप VAO के बारे में पूछ रहे हैं, मैं दूसरों में नहीं जाऊंगा; हालांकि यहाँ अन्य प्रकार के बफ़र्स की एक सूची है जिन्हें स्थापित किया जा सकता है।


इसलिए बफ़र हैं: GPU में 1.reside, 2. अधिकांश समय में एक प्रकार का डेटा (केवल शीर्ष, केवल रंग ect) होता है, 3.Data में हस्तक्षेप होता है, अर्थात 111122223333 ect। 4. डेटा एक्सेस करने की कोई विधि नहीं प्रदान करें (बफर नहीं [2] या बफर [वर्टेक्स_3434]) अब, एरेज़ हैं: बफ़र्स का 1. चयन, बफ़र्स को पार्स करने के तरीके के बारे में 2.स्टोर की जानकारी जिसमें यह शामिल है। , एक तत्व, ऑफ़सेट की आकार बफ़र्स से डेटा सही ढंग से पहुँचा जा सकता है तो ठीक है।?
coobit

1. बफ़र दोनों सिरों पर मौजूद होते हैं और सीपीयू और जीपीयू (पीछे और संभावित रूप से) के बीच स्थानांतरण होते हैं, वरना डिस्क से एक जाल लोड करते समय आप डेटा को जीपीयू में कैसे अपलोड करेंगे? हाँ, तत्व पूरे बफर में एकसमान प्रकार के होते हैं, लेकिन आप जिस तकनीक का उपयोग कर रहे हैं, उसके आधार पर प्रत्येक बफर तत्व एक आदिम या एक structप्रकार हो सकता है। डेटा इंटरलीव किया जा सकता है या प्रति बफर पूरी तरह से समान हो सकता है। आप उन्हें सीपीयू पर एक पारंपरिक सी सरणी के साथ के रूप में अनुक्रमित कर सकते हैं। ऐरे ऑब्जेक्ट्स (इस सही शब्दावली का उपयोग करें या अपने आप को भ्रमित करना समाप्त करें!) ... (नीचे जारी)
इंजीनियर

2. हाँ, और आपको स्पष्ट रूप से यह सुनिश्चित करने की आवश्यकता है कि आपके इन-शॉल्डर बफर घोषणाएं उन विशेषताओं से मेल खाएंगी जो आप अपने VAO द्वारा CPU पक्ष पर सेट करते हैं: "वर्टेक्स प्रोसेसर द्वारा उपयोग किए गए डेटा की परिभाषा से संबंधित सभी स्थिति एक वर्टेक्स में एन्क्रिप्टेड है सरणी वस्तु। " (क्रोनोस डॉक्स)
इंजीनियर

तो, बस नाखून को अधिक हिट करने के लिए ... एओ से पहले लोग केवल बीओ का उपयोग करके कैसे काम करते थे? या ओ ओ ओ हमेशा ओएनजीसी में मौजूद थे और यह सिर्फ वीएओ था जिसे बाद में वीबीओ में पेश किया गया था।
11

@coobit io7m.com/documents/history-vertex-spec - यह आपको फिक्स्ड पाइप लाइन (पुराने स्कूल) ओपनजीएल, 3 डी एफएक्स आदि और आधुनिक, प्रोग्रामेबल पाइपलाइन ओपनजीएल और डायरेक्ट 3 डी के बीच के अंतर का अंदाजा देता है।
इंजीनियर

5

यह शब्दावली OpenGL के इतिहास में निहित है। यह याद रखना महत्वपूर्ण है कि अधिकांश GL संस्करणों के लिए जो यहां प्रासंगिक हैं, OpenGL को वृद्धिशील रूप से विकसित किया गया था और एपीआई को बदलने के बजाय पहले से मौजूद एपीआई में नई कार्यक्षमता जोड़कर।

OpenGL के पहले संस्करण में इन ऑब्जेक्ट प्रकारों में से कोई भी नहीं था। ड्राइंग कई glBegin / glEnd कॉल जारी करके हासिल किया गया था, और इस मॉडल के साथ एक समस्या यह थी कि यह फ़ंक्शन कॉल ओवरहेड के संदर्भ में बहुत अक्षम था।

OpenGL 1.1 ने वर्टेक्स एरेज़ की शुरुआत करके इसे संबोधित करने के लिए पहला कदम उठाया। वर्टेक्स डेटा को सीधे निर्दिष्ट करने के बजाय अब आप इसे C / C ++ सरणियों से स्रोत बना सकते हैं - इसलिए नाम। तो एक वर्टेक्स ऐरे सिर्फ इतना है कि - वर्टिकल की एक सरणी और उन्हें निर्दिष्ट करने के लिए जीएल राज्य की आवश्यकता है।

अगला प्रमुख विकास जीएल 1.5 के साथ आया और सिस्टम ("क्लाइंट-साइड") मेमोरी के बजाय जीपीयू मेमोरी में वर्टेक्स एरे डेटा संग्रहीत करने की अनुमति दी। जीएल 1.1 वर्टेक्स ऐरे स्पेसिफिकेशन की एक कमजोरी यह थी कि हर बार जब आप इसे इस्तेमाल करना चाहते थे तो वर्टेक्स डेटा का पूरा सेट जीपीयू में ट्रांसफर करना पड़ता था; यदि यह पहले से ही GPU पर था, तो इस स्थानांतरण को टाला जा सकता था और संभावित प्रदर्शन लाभ हासिल किया जा सकता था।

इसलिए GPU पर इस डेटा को संग्रहीत करने के लिए एक नए प्रकार की GL ऑब्जेक्ट बनाई गई थी। जैसे टेक्सचर ऑब्जेक्ट को टेक्सचर डेटा स्टोर करने के लिए इस्तेमाल किया जाता है, वैसे ही वर्टेक्स बफर ऑब्जेक्ट वेरेक्स डेटा स्टोर करता है। यह वास्तव में एक अधिक सामान्य बफर ऑब्जेक्ट प्रकार का एक विशेष मामला है जो गैर-विशिष्ट डेटा संग्रहीत कर सकता है।

वर्टेक्स बफर ऑब्जेक्ट्स का उपयोग करने के लिए एपीआई पहले से मौजूद वर्टेक्स एरेस एपीआई पर पिग्गी-समर्थित था, यही कारण है कि आप इसमें बाइट ऑफ़सेट्स को पॉइंटर्स में परिवर्तित करने जैसी अजीब चीजें देखते हैं। इसलिए अब हमारे पास एक वर्टेक्स एरेज़ एपीआई है जो सिर्फ स्टेट को स्टोर करता है, जिसमें इन-मेमोरी मेमोरी के बजाय बफर ऑब्जेक्ट्स से डेटा को स्टोर किया जाता है।

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

शीर्ष सरणी ऑब्जेक्ट दर्ज करें, जो इस सब को एक साथ इकट्ठा करता है।

इसलिए, संक्षेप करने के लिए, एक शीर्ष सरणी ने ड्राइंग के लिए राज्य और डेटा (एक सरणी में संग्रहीत) के संग्रह के रूप में जीवन शुरू किया। एक वर्टेक्स बफर जीएल ऑब्जेक्ट प्रकार के साथ इन-मेमोरी एरे स्टोरेज को बदल देता है, वर्टेक्स ऐरे को केवल स्टेट करता है। एक वर्टेक्स ऐरे ऑब्जेक्ट इस राज्य के लिए सिर्फ एक कंटेनर ऑब्जेक्ट है, जिससे इसे आसानी से और कम एपीआई कॉल के साथ बदला जा सकता है।


0

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

एक बफ़र को संदर्भ के लिए बाध्य करने की आवश्यकता है, जबकि एक सरणी केवल डेटा का एक सरणी है। यदि मैं सही ढंग से याद करता हूं, तो बफर में डेटा का मतलब ग्राफिक्स कार्ड (इसलिए बाध्यकारी) पर कॉपी किया जाना है।

उम्मीद है इससे कुछ मदद मिली होगी


फिर GL_ARRAY_BUFFER क्या है? ऐसा क्यों कहा गया? आप के अनुसार परिकल्पना यह "
अनारक्षित

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

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