वर्टेक्स ऐरे का उपयोग कब करें और वीबीओ का उपयोग कब करें?


14

मैं शीर्ष सरणियों और वर्टेक्स बफर ऑब्जेक्ट्स के बारे में जानने की कोशिश कर रहा हूं , लेकिन मैं इसके संदर्भ में अंतर नहीं समझता:

  • केस-ऑफ़-यूज़ (स्थैतिक ज्यामिति जैसे इलाके, ज्यामिति जो हर फ्रेम को कण प्रणाली की तरह बदल देती है, आदि)
  • प्रदर्शन
  • पोर्टेबिलिटी (पुराने ग्राफिक्स कार्ड, कंसोल, Android या iPhone जैसे उपकरण, आदि)

कुछ स्पष्टीकरण?


3
किसी और के लिए जो यहाँ आता है, यहाँ सबसे अधिक मतदान के उत्तर की जाँच करें .... stackoverflow.com/questions/430555/…
afuzzyllama

जवाबों:


14

यहाँ VBOs के बारे में एक सभ्य लेखन है।

प्रदर्शन

यहाँ कॉलिंग शब्दार्थ का एक अच्छा अवलोकन है।

यहाँ प्रदर्शन के मुद्दों का एक और अच्छा अवलोकन है; इसमें हम देखते हैं कि VBO सरणियों की तुलना में अधिक प्रदर्शनकारी हैं।

वीबीओ को पसंद करने का कारण यह है कि डेटा कार्ड पर लोड किया गया है, और इसलिए आपको इसे हर फ्रेम में स्थानांतरित नहीं करना है। बनाए गए VBO के प्रकार के आधार पर, आप ग्राफिक्स ड्राइवर संकेत उपयोग पर दे सकते हैं (लेखन-कई, पढ़ने-कई बनाम लिखने-कई, कभी-नहीं, आदि)।

प्रयोग

VBO वास्तव में स्थैतिक ज्यामिति जैसे इलाके के लिए अच्छे हैं जिन्हें आप बदलने की उम्मीद नहीं करते हैं, या उदाहरण के लिए ज्यामिति के लिए।

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

पोर्टेबिलिटी

क्लाइंट साइड वर्टेक्स एरे , 3.0 से पहले ओपन में उपलब्ध हैं, 3.0 में पदावनत, और 3.1+ में चला गया। OpenGL ES उनका समर्थन करता है (OpenGL ES 2 नहीं करता है)।

VBOs ये OpenGL 1.5 के बाद उपलब्ध हैं। ये OpenGL ES 2 (और इसलिए, WebGL) में ज्यामिति डेटा संग्रहीत करने का एकमात्र तरीका है।


2
उस PerformanceTuning.pdf में, यह कहता है कि VBO "गैर-इष्टतम मामलों में प्रदर्शन को नुकसान पहुंचा सकता है" ... लेकिन यह विस्तृत नहीं है। किसी भी विचार उन मामलों क्या हैं? मेरे पास एक मामला है जहां मुझे हर फ्रेम को ज्यामिति को अपडेट करने की आवश्यकता है, इसलिए मैं सोच रहा हूं कि क्या उस मामले में एक वीबीओ की तुलना में एक वर्टेक्स सरणी बेहतर या खराब होगी। धन्यवाद।
१५:१२

1
read opengl.org/sdk/docs/man/xhtml/glDrawElements.xml और opengl.org/wiki/GlDrawElements - वर्टेक्स एरेस AREN'T पदावनत या हटाया नहीं गया, वे अभी भी OpenGL 4.x के रूप में समर्थित हैं; अपने तथ्यों को सीधे प्राप्त करें, दोस्त, क्योंकि आप जो फैला रहे हैं वह सिर्फ गलत सूचना है

1
@vaxview क्लाइंट साइड वर्टेक्स एरेज़ को हटा दिया जाता है। सर्वर साइड वर्टेक्स एरेज़ नहीं हैं। VAO अलग चीज हैं और राज्य को बचाने के लिए हैं। पोस्ट में कुछ भी गलत नहीं था, हालांकि अगर यह क्लाइंट का पक्ष हो तो अधिक सटीक हो सकता है। लेकिन मुझे लगता है कि निहित था।
अवधारणा

1
"क्लाइंट साइड वर्टेक्स सरणियों को हटा दिया गया है। सर्वर साइड वर्टेक्स एरेज़ नहीं हैं।" "वर्टेक्स एरेस ये 3.0 से पहले ओपन में उपलब्ध हैं, 3.0 में पदावनत, और 3.1+ में चला गया।" "आप वर्टिकल (...) के अलग-अलग सरणियों को निर्धारित कर सकते हैं और एक कॉल के साथ प्राइमेटिव्स के अनुक्रम का निर्माण करने के लिए glDrawElements में उपयोग कर सकते हैं। संस्करण 4.4 में कोर" - मैं इन बयानों में विरोधाभास देखता हूं।

2
इसके अलावा, कुछ कहने से पहले "पदावनत" किया जाता है, इस तरह के बयान के स्रोत को निर्दिष्ट करें, अधिमानतः आधिकारिक दस्तावेज में। प्रमाण के रूप में StackExchange से StackOverflow की ओर इशारा करना विज्ञान के काम करने का तरीका नहीं है, और "मुझे लगता है कि निहित था" के साथ बचाव करना एक तर्क नहीं है। क्लाइंट / सर्वर सरणियों के बारे में किसी ने भी नहीं पूछा, सवाल वीबीओ की तुलना में व्यापक अर्थों में शीर्ष सरणी के बारे में था। Btw, मैं VAO के बारे में कुछ भी नहीं कहा है, जहां से विचार है?

11

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

वी ertex बी uffer हे bjects (जो वास्तव में नहीं के अन्य प्रकार से भिन्न हैं बी uffer हे bjects, उदाहरण के लिए यू niform बी uffer हे bjects) ग्राफिक्स हार्डवेयर पर अपलोड शिखर डेटा के लिए एक साधन प्रदान करते हैं।

V ertex A rray O bjects का उपयोग VBO s के अलावा क्लाइंट-साइड (CPU-side) प्रदर्शन को बेहतर बनाने के लिए किया जाता है , हर बार जब आप चाहें तो व्यक्तिगत शीर्ष बफ़र को रिवाइंड करने के लिए आवश्यक कॉल की संख्या को कम करके और वर्टेक्स विशेषताओं को फिर से सेट करें। एक निश्चित तरीके से रेंडर करने के लिए परिवर्तन। हर फ्रेम का काम करने के बजाय, आप इसे एक बार (आरंभीकरण पर) करते हैं, और उसके बाद संबंधित वर्टिक्स विशेषताओं का उपयोग करने वाले प्रत्येक कॉल (सेट) के लिए उपयुक्त VAO को रीबेंड करते हैं।

इसके बावजूद, VAO का उपयोग आपको किसी भी डेटा के लिए glBindBuffer+ करने की अतिरिक्त ज़िम्मेदारी से मुक्त नहीं करता है , glBufferDataजो प्रत्येक फ़्रेम को बदलता है , उदाहरण के लिए, गेम एंटिटी पोजीशन / घुमाव / ट्रांसफॉर्म मैट्रेस। यह केवल तब होता है जब आपके पास पूरी तरह से स्थिर डेटा होता है जिसे आपको केवल glBindVertexArray(&vao) -> glDraw*(...) -> glBindVertexArray(0)रेंडर करने की आवश्यकता होती है ।


+1 VAO एक भयानक और भ्रमित करने वाला नाम है, और यह हमेशा मुझे याद दिलाता है कि एक गड़बड़ ओपनगेल क्या बन गया है।
कॉन्सेप्ट 3 डी

1
मुझे यह भी याद है कि इस प्रश्न के बारे में एक चर्चा चल रही थी (अधिकांश इसे हटा दिया गया था)। फिर से समस्या OpenGL की भयानक शब्दावली के साथ है। मैंने क्रिस उत्तर को अधिक सटीक होने के लिए भी संपादित किया।
कॉन्सेप्ट 3 डी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.