एक ओपनजीएल वर्टेक्स ऐरे ऑब्जेक्ट (VAO) में किस राज्य को संग्रहीत किया जाता है और मैं VAO का सही उपयोग कैसे करूं?


25

मैं सोच रहा था कि एक OpenGL VAO में कौन सा राज्य संग्रहीत है। मैं समझ गया हूं कि एक VAO में बफ़र्ड वर्टिक्स (क्या गुण बफ़र्स में हैं, और बफ़र्स बाध्य हैं, ...) की शीर्ष विशिष्टताओं से संबंधित स्थिति है। VAO के सही उपयोग को बेहतर ढंग से समझने के लिए, मैं जानना चाहता हूं कि वे किस राज्य में हैं।


मुझे लगता है कि VAO का उपयोग कैसे किया जाना चाहिए

सरल उदाहरणों से, मैं समझ गया हूं कि VAO का सही उपयोग निम्नानुसार है:

सेट अप

Generate VAO
BindVAO
---- Specify vertex attributes
---- Generate VBO's
---- BindVBO's
-------- Buffer vertex data in VBO's
---- Unbind VBO's
Unbind VAO

प्रतिपादन

Bind VAO
---- Draw
Unbind VAO

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


इसलिए, मेरे प्रश्न हैं:

  • OpenGL VAO में कौन सी सटीक स्थिति संग्रहीत है ? (VBO बाइंडिंग, विशेषता विनिर्देश, सक्रिय shader कार्यक्रम, बनावट बाइंडिंग, बनावट नमूना / रैपिंग सेटिंग्स, वर्दी ...?)
  • मैं VAO का अधिक जटिल रेंडरिंग सेटअप में सही तरीके से कैसे उपयोग करूं जहां (एकाधिक) संबद्ध नमूने / रैपिंग सेटिंग्स के साथ बनावट, (एकाधिक) शेडर प्रोग्राम और वर्दी शामिल हैं?

1
VAO शीर्ष विशेषता स्थानों के बारे में डेटा संग्रहीत करता है। यह वीबीओ की आईडी भी संग्रहीत करता है जिसमें ये विशेषताएँ निहित होती हैं। जब आप कुछ आकर्षित करते हैं तो आपको वीबीओ को बांधने की आवश्यकता नहीं होती है, आपको वीएओ बनाते समय glVertexAttribPointer () को कॉल करने से पहले इसे बांधने की आवश्यकता होती है।
होलीब्लैककैट

जवाबों:


18

VAO शीर्ष विशेषता स्थानों के बारे में डेटा संग्रहीत करता है। (और उनसे जुड़े कुछ अन्य डेटा।)
"VBO bindings, active shader program, texture bindings, texture sampling/wrapping settings, uniforms"इसके लिए पूरी तरह से असंबंधित हैं।

आप पूछ सकते हैं कि यह वीबीओ बाध्यकारी क्यों याद नहीं करता है। क्योंकि आपको किसी चीज़ को खींचने के लिए VBO को बांधने की ज़रूरत नहीं है, आपको केवल VAO बनाते समय इसे बाँधने की आवश्यकता है: जब आप कॉल करते हैं glVertexAttribPointer(...), तो VAO को याद आता है कि VBO वर्तमान में बाध्य है। और जब आप इसे खींचते हैं, तो VAO इन VBO से विशेषताएँ लेगा, भले ही ये VBO वर्तमान में बाध्य न हों।


इसके अलावा, VAO और VBO को थोड़ा अलग तरह से इस्तेमाल किया जाना चाहिए:

यह काम नहीं करेगा

Generate VAO
BindVAO
---- Specify vertex attributes
---- Generate VBO's
---- BindVBO's
-------- Buffer vertex data in VBO's
---- Unbind VBO's
Unbind VAO

क्योंकि आपको विशेषता स्थानों को निर्दिष्ट करने के लिए VBO को बांधने की आवश्यकता है।

तो, आपको इसे इस तरह करना चाहिए:

Generate VAO
BindVAO
Generate VBO's
BindVBO's
Specify vertex attributes

आप जब चाहें VBO का डेटा बदल सकते हैं, लेकिन आपको इसे पहले ही बाँध लेना चाहिए।

और ड्राइंग इस तरह दिखना चाहिए:

Bind VAO
Draw


जैसा कि आपने देखा, मैंने unbindआपकी सूचियों से कॉल हटा दी हैं। वे लगभग पूरी तरह से बेकार हैं और वे आपके कार्यक्रम को थोड़ा धीमा कर देंगे, इसलिए मुझे उन्हें कॉल करने का कोई कारण नहीं दिखता।


9
"तो मैं उन्हें कॉल करने के लिए कोई कारण नहीं देखता।" गलती से उन्हें बदलने से रोकने के लिए। 3-पार्टी लाइब्रेरी का उपयोग करते समय विशेष रूप से एक समस्या।
शाफ़्ट फ्रीक

शानदार जवाब के लिए धन्यवाद! तो संक्षेप में, VAO केवल शीर्ष विशेषता स्थानों को संग्रहीत करता है। वीएओ को बाध्य करते समय वीबीओ का पुनर्जन्म नहीं होता है, क्योंकि वीएओ जानता है कि बफ़र्स को किन विशेषताओं को ढूंढना है। अन्य सभी राज्य वैश्विक ओपनजीएल राज्य में निहित हैं।
जेल वैन कैम्पेन

@ जेलेवनकम्पेन हां, सही। FYI करें, यह स्टेट ऑफ एट्रीब्यूट्स ( gl{Enable|Disable}VertexAttribArray()), उनके डिफ़ॉल्ट मान ( glVertexAttrib*()), उनके इंस्टेंसिंग मोड ( glVertexAttribDivisor()) और शायद कुछ और को भी स्टोर करता है।
होलीब्लैककैट

@HolyBlackCat क्या आप निश्चित हैं कि डिफ़ॉल्ट राज्य (glVertexAttrib ()) VAO राज्य का हिस्सा है? ओपनजीएल विकी का दावा है, अन्यथा, वे संदर्भ राज्य हैं।
rdb

@ औरब नहीं, मुझे यकीन नहीं है। मुझे उम्मीद थी कि वे VAO राज्य का हिस्सा होंगे, और मैंने इसकी जाँच नहीं की।
होलीब्लैककट

4

यह केवल शीर्ष बाइंडिंग और इंडेक्स बफर बाइंडिंग को संग्रहीत करता है

glVertexAttribPointerप्लस के सभी मापदंडों को कॉल करने के समय glVertexAttribPointerऔर बाध्य Element_Array_buffer के लिए Vertex_Array_buffer के लिए बाध्य बफर है।

वर्दी वर्तमान कार्यक्रम का हिस्सा हैं।

बाकी सब कुछ वैश्विक स्थिति है।

संदेह में, आप जिस संस्करण का उपयोग कर रहे हैं उसकी कल्पना में राज्य की तालिकाओं की जांच कर सकते हैं।


उत्तर के लिए भी धन्यवाद! यह मेरे लिए चीजों को साफ करता है।
जेल वैन कैम्पेन

4

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

i.e float vbo[]={1.0,2.0,34.0...}

और जिस तरह से ओपनजीएल को काम करने के लिए डिज़ाइन किया गया था वह यह है कि आपको निश्चित रूप से यह देखना होगा कि आपके डेटा को विभिन्न शेड्स में भेजना कैसा लग रहा है

इसमें आपको यह भी परिभाषित करना है कि यह उस डेटा को कैसे पढ़ेगा, यह किस प्रारूप में है, और इसके साथ क्या करना है और इसका उपयोग कैसे किया जाएगा और किस लिए, यह सभी जानकारी VAO में संग्रहीत है।

उदाहरण के लिए आप इस तरह से एक सरणी में संग्रहीत डेटा की घोषणा कर सकते हैं float vbo = {11.0,2.0,3.0,4.0}

इस बिंदु पर आगे क्या आवश्यक है, वीएओ में वीबीओ से उस डेटा की व्याख्या कैसे की जाती है, और इसका क्या अर्थ है इस प्रकार है

VAO को 2 फ़्लोट प्रति वर्टेक्स पढ़ने के लिए सेट किया जा सकता है (जो दो आयाम x, y के साथ 2 वैक्टर बना देगा) या आप इसे 4 आयामों जैसे x, y, z, w आदि के साथ 1 वेक्टर के रूप में व्याख्या करने के लिए कह सकते हैं।

लेकिन उस डेटा की अन्य विशेषताओं को भी परिभाषित किया जाता है और VAO में संग्रहीत किया जाता है जैसे कि डेटा प्रारूप (इसके बावजूद कि आपने फ्लोट की एक सरणी घोषित की है, तो आप इसे एक पूर्णांक के रूप में पढ़ने के लिए shader को बता सकते हैं, बेशक सिस्टम कच्चे डेटा को परिवर्तित कर रहा है फ्लोट से पूर्णांक तक की प्रक्रिया और नियमों का अपना सेट है कि ऐसी परिस्थितियों में क्या करना है)

तो मूल रूप से VBO डेटा है, और VAO उस डेटा की व्याख्या करने का तरीका संग्रहीत करता है, क्योंकि shaders और OpenGL सर्वर को बहुत ही नकचढ़ा बनाया गया है और इसे कैसे संसाधित किया जाए और इसके साथ क्या करना है, यह तय करने से पहले सब कुछ जानना आवश्यक है। इदर रखना

बेशक, यह वास्तव में बुरा नहीं है, यह वास्तव में सबसे अधिक कुशल लग रहा है क्योंकि इसे ग्राफिक्स सर्वर मेमोरी पर उस डेटा को संग्रहीत करने की आवश्यकता है ताकि इसे सबसे कुशल और तेज प्रसंस्करण प्राप्त हो जाए (जब तक कि यह तय न हो जाए कि ऐसा करने की आवश्यकता नहीं है डेटा को इस तरह से संसाधित नहीं किया जाना चाहिए और कुछ अन्य जानकारी के लिए उपयोग किया जाता है जो अक्सर पहुंच नहीं होती है), और इसलिए क्यों डेटा के साथ क्या करना है और इसे कैसे संसाधित करना है इसका विवरण VAO में संग्रहीत किया जाना आवश्यक है, इसलिए VAO हेडर की तरह होता है और VBO शुद्ध कच्चे डेटा की तरह होता है जिसे हेडर उपयोग करता है और परिभाषित करता है (इस मामले में शेड वर्टेक्स विशेषताओं के पास जाता है) इस अपवाद के साथ कि वीबीओ केवल एक वीएओ द्वारा उपयोग किए जाने के लिए सीमित नहीं है, यह इस्तेमाल किया जा सकता है और पुन: उपयोग और कई VAO के उदाहरण के लिए बाध्य है:

आप क्या कर सकते हैं कि आप एक बफर ऑब्जेक्ट को VAO1 से बाँध सकते हैं और (अलग-अलग) उसी बफर ऑब्जेक्ट को VAO2 से बाँध सकते हैं, प्रत्येक को अलग-अलग तरीके से व्याख्या करने के लिए ताकि यदि आपका शेडर डेटा को प्रोसेस करने के लिए है, जिसके आधार पर VAO वह है बाध्य होने पर यह उसी कच्चे डेटा को भिन्न रूप से फ़्रैम्फ़र (विंडो के लिए ड्राइंग पिक्सेल) के रूप में संसाधित करेगा, जिसके परिणामस्वरूप एक ही डेटा का अलग-अलग प्रदर्शन होगा, जो इस बात पर आधारित होगा कि आपने VA में इसके उपयोग को कैसे परिभाषित किया है।


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