पहले, वीएओ से पहले अंतिम वर्टेक्स विशेषता बाइंडिंग ("एक सूचकांक बफर (GL_ELEMENT_ARRAY_BUFFER_BINDING
) के लिए वीबीओ बाध्यकारी केवल" याद करता है ", यदि कोई है तो)। तो glDrawElements()
में ऑफ़सेट को याद नहीं है, आपको वीएओ का उपयोग करते समय बाद में कॉल करने की आवश्यकता है। यह laso आप interleaved vertex सरणी का उपयोग करने से नहीं रोकता है। मुझे समझाने की कोशिश करते हैं:
int vbo[3];
glGenBuffers(3, vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glBufferData(GL_ARRAY_BUFFER, data0, size0);
glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
glBufferData(GL_ARRAY_BUFFER, data1, size1);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[2]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, data2, size2);
// create some buffers and fill them with data
int vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
// create a VAO
{
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); // not saved in VAO
glVertexAttribPointer(0, 3, GL_FLOAT, false, 3 * sizeof(float), NULL); // this is VAO saved state
glEnableVertexAttribArray(0); // this is VAO saved state
// sets up one vertex attrib array from vbo[0] (say positions)
glBindBuffer(GL_ARRAY_BUFFER, vbo[1]); // not saved in VAO
glVertexAttribPointer(1, 3, GL_FLOAT, false, 5 * sizeof(float), NULL); // this is VAO saved state
glVertexAttribPointer(2, 2, GL_FLOAT, false, 5 * sizeof(float), (const void*)(2 * sizeof(float))); // this is VAO saved state
glEnableVertexAttribArray(1); // this is VAO saved state
glEnableVertexAttribArray(2); // this is VAO saved state
// sets up two more VAAs from vbo[1] (say normals interleaved with texcoords)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[2]); // this is VAO saved state
// uses the third buffer as the source for indices
}
// set up state that VAO "remembers"
glBindVertexArray(0); // bind different vaos, etc ...
बाद में ...
glBindVertexArray(vao); // bind our VAO (so we have VAAs 0, 1 and 2 as well as index buffer)
glDrawElements(GL_TRIANGLE_STRIP, 57, GL_UNSIGNED_INT, NULL);
glDrawElements(GL_TRIANGLE_STRIP, 23, GL_UNSIGNED_INT, (const void*)(57 * sizeof(unsigned int)));
// draws two parts of the mesh as triangle strips
तो आप देख ... आप glDrawElements
का उपयोग कर interleaved शिखर सरणियों एक भी VAO और एक या अधिक VBOs का उपयोग कर बना सकते हैं।
अपने प्रश्न के दूसरे भाग का उत्तर देने के लिए, या तो जाल के विभिन्न हिस्सों के लिए अलग-अलग वीएओ और वीबीओ हो सकते हैं (इसलिए अलग-अलग हिस्सों को चित्रित करना आसान है), या आप सभी को एक वीएओ वीबीओ जोड़ी में फ्यूज कर सकते हैं (इसलिए आपको आवश्यकता है glBind*()
को अक्सर कॉल न करें) और जाल के अलग-अलग हिस्सों को आकर्षित करने के लिए एकाधिक glDraw*()
कॉल का उपयोग करें (जैसा कि ऊपर दिए गए कोड में देखा गया है - कल्पना करें कि पहले glDrawElements()
जहाज खींचता है और दूसरा बुर्ज खींचता है, आप बस कॉल के बीच कुछ मैट्रिक्स वर्दी अपडेट करते हैं)।
क्योंकि शेडर्स में वर्दी में एकाधिक मॉडलव्यू मैट्रिक्स हो सकते हैं, तो आप जाल आईडी को एक और वर्टेक्स विशेषता के रूप में भी एन्कोड कर सकते हैं, और कशेरुक शेडर को इस विशेषता के आधार पर वर्टेक्स को बदलने के लिए किस मैट्रिक्स का उपयोग करना है। प्रत्येक विचार को प्रत्येक मैट्रिक्स के लिए आवंटित कुछ वजन के साथ, एक ही चरम पर एकाधिक मैट्रिक्स का उपयोग करने के लिए भी यह विचार बढ़ाया जा सकता है। इसका उपयोग आम तौर पर प्लेयर चरित्र जैसे कार्बनिक ऑब्जेक्ट्स को एनिमेट करते समय किया जाता है ("स्किनिंग" देखो)।
वर्दी बफर ऑब्जेक्ट्स के रूप में जाना जाता है, केवल एक ही फायदा यह है कि आप उनमें बहुत सारे डेटा पैक कर सकते हैं और उन्हें आसानी से शेडर्स के बीच साझा किया जा सकता है (बस यूबीओ को किसी भी शेडर को बाध्य करने के लिए बाध्य करें)। आपके लिए उनका उपयोग करने में कोई वास्तविक लाभ नहीं है, सिवाय इसके कि यदि आपके पास matrices के 1OOOs के साथ ऑब्जेक्ट्स हों।
इसके अलावा, मैंने स्मृति से उपरोक्त स्रोत कोड लिखे हैं। मुझे पता है अगर वहाँ कुछ त्रुटियों/समस्याएं हैं करते हैं ...
कूल मुझे लगता है कि मैं इसे interleaving के साथ मिलता है, इसे आजमा देना है। लेकिन मुझे लगता है कि आपने यह सुनिश्चित करने के लिए गलती की है कि पहले glvertexAttribPointer को कशेरुक पदों के लिए डिफॉल्ट करने में, जैसा कि मैंने समझा है कि वर्टेक्स पदों को vbo [0] में कसकर पैक किया गया है, फिर भी आपने इसे एक रास्ता दिया है? पदों के लिए आगे शून्य नहीं होना चाहिए क्योंकि वे interleaved नहीं हैं। – CodeMonkey
मुझे शेडर में जाल आईडी के बारे में विचार पसंद है और इसे एक विशेषता के रूप में पास किया गया है, लेकिन मैं शेडर (जैसे वर्दी सरणी) में कई मैट्रिक्स में पार्सिंग के बारे में कैसे जाउंगा? क्या यह है जहां मैं यूबीओ का उपयोग 10 अलग-अलग टर्रेट्स के लिए 10 अलग-अलग रूपांतरण मैट्रिक्स कह सकता हूं और शेडर के अंदर सही मैट्रिक्स को देखने के लिए एक विशेषता के रूप में विश्लेषण किए गए इंडेक्स का उपयोग कर सकता हूं? यह मुझे एक पूरे जहाज को एक साथ जाने के साथ पूरे जहाज को चित्रित करने वाले glmultiDrawElements/Arrays फ़ंक्शंस का उपयोग करने में सक्षम बनाता है? – CodeMonkey
हाय, घुमावदार के साथ अच्छा अवलोकन। लेकिन यह एक त्रुटि नहीं है। या तो मैं आगे 0 छोड़ सकता हूं और ओपनजीएल जानता है (दूसरे और तीसरे तर्क से) कि मेरे पास 3 डी जीएल_एफएलएटीएस की धारा है (और इसलिए आकार 3 * आकार (फ्लोट) है), या मैं इसके लिए आगे की गणना कर सकता हूं। इसके साथ कुछ भी गलत नहीं है। आगे स्पष्टीकरण के लिए - लगातार दो अक्षरों के पते के बीच दूरी है, यह उनके बीच की जगह नहीं है (इसलिए 0 का मतलब यह नहीं है कि शिखर के बीच कोई अप्रयुक्त बाइट नहीं है, इसका मतलब है कि ओपनजीएल को आयामों की संख्या से असली प्रगति की गणना करनी चाहिए और डेटा प्रकार का इस्तेमाल किया)। –