2012-08-06 54 views
80

मैं आज इस ट्यूटोरियल से ओपनजीएल सीखना शुरू कर रहा हूं: http://openglbook.com/the-book/
मुझे अध्याय 2 मिला, जहां मैं त्रिकोण खींचता हूं, और मैं वीएओ को छोड़कर सब कुछ समझता हूं (क्या यह संक्षिप्त नाम ठीक है?)। ट्यूटोरियल में यह कोड है:वेरटेक्स ऐरे ऑब्जेक्ट्स क्या हैं?

glGenVertexArrays(1, &VaoId); 
glBindVertexArray(VaoId); 

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

एक शीर्ष सरणी वस्तु (या VAO) एक वस्तु का वर्णन करता है कि कैसे शीर्ष गुण एक वर्टेक्स बफर वस्तु (या VBO) में जमा हो जाती है। इसका मतलब है कि VAO वास्तविक वस्तु शिखर डेटा भंडारण, लेकिन शिखर डेटा की वर्णनकर्ता नहीं है। Vertex विशेषताओं को glVertexAttribPointer फ़ंक्शन और इसकी दो बहन फ़ंक्शन glVertexAttribIPointer और glVertexAttribLPointer द्वारा वर्णित किया जा सकता है, जिसमें से पहला हम नीचे देखेंगे।

मुझे समझ में नहीं आता कि वीएओ वर्टेक्स विशेषताओं का वर्णन कैसे करता है। मैंने उन्हें किसी भी तरह से वर्णित नहीं किया है। क्या यह glVertexAttribPointer से जानकारी प्राप्त करता है? मुझे लगता है कि यह होना चाहिए। क्या वीएओ बस glvertexAttribPointer से जानकारी के लिए एक गंतव्य है?

एक तरफ ध्यान दें पर, ट्यूटोरियल मैं अनुसरण कर रहा हूं स्वीकार्य है? क्या मुझे कुछ भी देखना चाहिए या अनुसरण करने के लिए एक बेहतर ट्यूटोरियल है?

उत्तर

77

"वेरटेक्स ऐरे ऑब्जेक्ट" आपको सिली नामों के लिए ओपनजीएल एआरबी उपसमिती द्वारा लाया गया है। एक ज्यामिति वस्तु के रूप में इसके बारे में

Think। (पुराने समय के रूप में एसजीआई परफॉर्मर प्रोग्रामर, मैं उन्हें geosets कहते हैं।) ऑब्जेक्ट के आवृत्ति चर/सदस्य आपके vertex सूचक, सामान्य सूचक, रंग सूचक, attrib एन सूचक, ...

जब एक वीएओ पहले होता है बाध्य, आप

glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer...; 
glEnableClientState(GL_NORMAL_ARRAY); glNormalPointer...; 

और इतने पर फोन करके इन सदस्यों आवंटित। कौन सा गुण सक्षम हैं और आपके द्वारा प्रदान किए जाने वाले पॉइंटर्स को वीएओ में संग्रहीत किया जाता है।

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

(एक समय सेटअप, एकाधिक उपयोग VAOs उपयोग करने के लिए सबसे आसान तरीका है, लेकिन आप भी सिर्फ यह बंधन और अधिक कर रही है/सूचक कॉल सक्षम द्वारा गुण बदल सकते हैं। VAOs स्थिरांक नहीं हैं।)

अधिक में जानकारी पैट्रिक के सवालों के जवाब:

नव निर्मित वीएओ के लिए डिफ़ॉल्ट यह है कि यह खाली है (AFAIK)। कोई ज्यामिति बिल्कुल, यहां तक ​​कि vertexes नहीं है, इसलिए यदि आप इसे आकर्षित करने के लिए प्रयास करते हैं, तो आप एक ओपन त्रुटि प्राप्त होगी। यह उचित रूप से सादा है, जैसा कि "सबकुछ गलत/शून्य/शून्य" में आरंभ करें।

आप केवल जब आप चीजों की स्थापना की glEnableClientState की जरूरत है। वीएओ प्रत्येक सूचक के लिए सक्षम/अक्षम स्थिति को याद करता है।

हां वीएओ glEnableVertexAttribArray और glVertexAttrib स्टोर करेगा। पुराने कशेरुका, सामान्य, रंग, ... सरणी विशेषता arrays, vertex == # 0 और इसी तरह के समान हैं।

+41

'' वेरटेक्स ऐरे ऑब्जेक्ट "आपको सिली नामों के लिए ओपनजीएल एआरबी उपसमिती द्वारा लाया गया है। ' हां, ** ऑब्जेक्ट ** के लिए यह मूर्खतापूर्ण नाम ** जो ** vertex ** ** सरणी ** बाइंडिंग स्टोर करता है। –

+0

यदि मैं आपको सही ढंग से समझता हूं, तो 'glGenVertexArrays (1, और VaoId);' और 'glBindVertexArray (VaoId) को कॉल करना;' 'glEnableClientState' से आपको सहेजने के लिए सैन डिफ़ॉल्ट के साथ एक वीएओ बनाता है? या मैं पूरी तरह से आपको गलत समझ रहा हूँ? भविष्य में क्या मैं अधिकतर 'glEnableClientState' का उपयोग करूंगा? – Patrick

+2

इसके अलावा, 'glVertexAttribPointer' – Patrick

8

वर्टेक्स ऐरे ऑब्जेक्ट्स मैक्रोज़ शब्द संसाधन प्रोग्राम और इसी तरह की तरह हैं। एक अच्छा विवरण here पाया गया है।

मैक्रो सिर्फ ऐसे सक्रिय रूप कार्यों तुमने किया था, इस विशेषता याद है, यह है कि बफर बाँध आदि जब आप glBindVertexArray(yourVAOId) फोन, यह बस रिप्ले उन विशेषता सूचक बाइंडिंग और बफर बाइंडिंग।

तो आपके अगले कॉल को वीओओ द्वारा बाध्य किया गया उपयोग करने के लिए आकर्षित करने के लिए।

वीएओ वर्टेक्स डेटा स्टोर नहीं करता है। नहीं। कशेरुक डेटा एक कशेरुक बफर या क्लाइंट मेमोरी की सरणी में संग्रहीत किया जाता है।

+12

-1: वे मैक्रोज़ की तरह नहीं हैं। यदि वे थे, तो एक नया वीएओ बाध्यकारी पिछले वीएओ द्वारा सक्षम वर्टेक्स सरणी को अक्षम नहीं करेगा, जब तक कि नए वीएओ ने आपको "रिकॉर्ड" नहीं किया है * स्पष्ट रूप से * उन सरणी को अक्षम करना। वीएओ, जैसे * सभी * ओपनजीएल ऑब्जेक्ट्स, होल्ड * स्टेट *, कमांड नहीं। आदेश बस * परिवर्तन * राज्य, लेकिन वस्तुओं डिफ़ॉल्ट राज्य सेट के साथ आते हैं। यही कारण है कि एक नव निर्मित वीएओ बाध्यकारी * हमेशा * सभी विशेषताओं को अक्षम कर देगा। –

4

वीएओ एक ऐसा ऑब्जेक्ट है जो ओपनजीएल पाइपलाइन के वर्टेक्स फ़ेच चरण का प्रतिनिधित्व करता है और वर्टेक्स शेडर में इनपुट की आपूर्ति के लिए उपयोग किया जाता है।

आप इस

GLuint vao; 
glCreateVertexArrays(1, &vao); 
glBindVertexArray(vao); 

सबसे पहले जाने की तरह शिखर सरणी वस्तु बना सकते हैं 'एक सरल उदाहरण है। एक शेडर कोड

layout (location = 0) in vec4 offset; // input vertex attribute 

इस विशेषता में भरने के लिए में इस तरह के एक इनपुट पैरामीटर पर विचार करें तो हम आपको

glVertexAttrib4fv(0, attrib); // updates the value of input attribute 0 

हालांकि शिखर सरणी वस्तु भंडार का उपयोग कर सकते के लिए इन स्थिर विशेषता मान, यह एक बहुत कुछ कर सकते अधिक।

वर्टेक्स सरणी ऑब्जेक्ट बनाने के बाद हम अपने राज्य को भरना शुरू कर सकते हैं। हम ओपनजीएल से एक बफर ऑब्जेक्ट में संग्रहीत डेटा का उपयोग करके इसे स्वचालित रूप से भरने के लिए कहेंगे। प्रत्येक वर्टेक्स विशेषता को बफर से डेटा को कई वर्टेक्स बफर बाइंडिंग में से एक तक ले जाना पड़ता है। इस अंत के लिए हम glVertexArrayAttribBinding(GLuint vao, GLuint attribindex, GLuint bindingindex) का उपयोग करते हैं। इसके अलावा हम glVertexArrayVertexBuffer() फ़ंक्शन का उपयोग कशेरुक बफर बाइंडिंग में से किसी एक को बफर बांधने के लिए करते हैं। हम डेटा के लेआउट और प्रारूप का वर्णन करने के लिए glVertexArrayAttribFormat() फ़ंक्शन का उपयोग करते हैं, और अंत में हम glEnableVertexAttribArray() पर कॉल करके विशेषता को स्वत: भरने में सक्षम करते हैं।

जब एक शीर्ष विशेषता सक्षम किया गया है, ओपन शीर्ष प्रारूप और स्थान की जानकारी आप glVertexArrayVertexBuffer() और glVertexArrayAttribFormat() के साथ प्रदान की है, उसके आधार शेडर करने के लिए डेटा फीड होगा। जब विशेषता अक्षम कर दी गई है, तो वर्टेक्स शेडर को आपके द्वारा प्रदान की जाने वाली स्थिर जानकारी प्रदान की जाएगी glVertexAttrib*() पर।

// First, bind a vertex buffer to the VAO 
glVertexArrayVertexBuffer(vao, 0, buffer, 0, sizeof(vmath::vec4)); 

// Now, describe the data to OpenGL, tell it where it is, and turn on automatic 
// vertex fetching for the specified attribute 
glVertexArrayAttribFormat(vao, 0, 4, GL_FLOAT, GL_FALSE, 0); 

glEnableVertexArrayAttrib(vao, 0); 

और कोड एक शेडर

layout (location = 0) in vec4 position; 

तुम सब glDeleteVertexArrays(1, &vao) को कॉल करने की आवश्यकता के बाद में।


आप OpenGL SuperBible पढ़ यह बेहतर समझने के लिए कर सकते हैं।

+2

डीएसए-स्टाइल ओपनजीएल के उपयोग को बढ़ावा देने वाले लोगों को देखना अच्छा होता है। –