2010-09-08 14 views
10

मैंने देखा है कि जब तक मैं फिर से फोन VertexAttribPointer, वहाँ shaders के लिए इनपुट एक BindBuffer के बाद नहीं है। क्या यह आवश्यक है? शेडर्स लिखित में नहीं बदल सकते हैं, लेकिन केवल बफर इस्तेमाल किए जाते हैं।VertexAttribPointer प्रत्येक BindBuffer के बाद आवश्यक है?

उत्तर

24

टिबुर पहले से ही वास्तविक प्रश्न का उत्तर दिया, लेकिन मैंने सोचा कि मैं कुछ संदर्भ जोड़ूंगा।

glBindBuffer(GL_ARRAY_BUFFER, ...) स्वयं कुछ भी नहीं करता है। इसे glVertexAttribPointer पर अतिरिक्त तर्क के रूप में सोचें।

याद रखें, आप अलग-अलग विशेषताओं के लिए कई बफ़र्स बाध्य कर सकते हैं (जैसे कि attrib 0, vbo 1 का उपयोग करता है, जबकि attrib 1 और 2 उपयोग vbo 2)। आप उस सेटअप के लिए क्या एपीआई ऑर्डर देखेंगे?

वास्तविक एपीआई के साथ, कुछ की तरह है:

glBindBuffer(GL_ARRAY_BUFFER, 1); 
glVertexAttribPointer(0, ...) 
glBindBuffer(GL_ARRAY_BUFFER, 2); 
glVertexAttribPointer(1, ...) 
glVertexAttribPointer(2, ...) 

glDraw*(...) 

क्यों विनिर्देश काम कि जिस तरह से करेंगे? खैर, यह पीछे की संगतता अपने सिर का पालन कर रहा है। जब VBOs शुरू किए गए थे, glVertexPointer एट अल। किस बफर ऑब्जेक्ट का उपयोग करने के लिए पास करने के लिए कोई पैरामीटर नहीं था। या तो यह प्रत्येक अर्थ (VertexPointer/NormalPointer/TexCoordPointer ...) के लिए कई नए entrypoints था, या यह अपने आप में एक अतिरिक्त entrypoint, जो सिर्फ * सूचक कॉल के लिए एक अतिरिक्त पैरामीटर के रूप में काम कर रहा था था। उन्होंने बाद वाले को चुना (एक साइड नोट के रूप में, यही कारण है कि आपको बफर के अंदर एक पॉइंटर के रूप में ऑफसेट पास करना होगा)।

13

ओपनजीएल OpenGL specifications के अनुसार, पृष्ठ 51 (बफर ऑब्जेक्ट स्टेट), सरणी पॉइंटर्स से संबंधित राज्य बफर आईडी संग्रहीत करता है। इसका मतलब है कि आप के साथ आकर्षित करने के लिए बफर वस्तु को बदलना चाहते हैं, तो आप जरूरत glVertexAttribPointer समारोह को याद करने के लिए।

glBindBuffer(1); 
glVertexPointer(...); 
glDrawArrays(...); /// Drawing will use buffer 1 

glBindBuffer(2); 
glDrawArrays(...); /// Drawing will still use buffer 1 

glVertexPointer(...); 
glDrawArrays(...); /// Drawing will now use buffer 2 
संबंधित मुद्दे