2011-09-28 13 views
11

यह एक नोब सवाल हो सकता है। जैसा कि मैं इसे समझता हूं, glBindAttribLocation (..., एएए, ...) एएए की स्थान आईडी पर प्रोग्राम के भीतर एक विशेषता को बाध्य करेगा, जब तक एएए अद्वितीय है। अगर मैं निम्नलिखित कोड है:GLES2 क्या glbindAttribLocation() आवश्यक है?

glBindAttribLocation(..., 0, "XXX"); 
glBindAttribLocation(..., 1, "YYY"); 

इस स्थान आईडी 0 और 1. करने के लिए अपने दो चर के लिए बाध्य होगा मैं तो कहेंगे:

glBindBuffer(GL_ARRAY_BUFFER, VBId); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBId); 

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, 0); 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (void *) 0 + sizeof(float) * 3); 
glEnableVertexAttribArray(1); 

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); 

इस बिंदु तक, मैं समझता हूँ कि की आईडी 0 और 1 को पहले पैरामीटर के रूप में glVertexAttribPointer() में पास किया गया है।

क्या यह मानना ​​सुरक्षित होगा कि अगर मैंने glGetAttribLocation() कॉल के माध्यम से गुणों (उपर्युक्त) के स्थान आईडी प्राप्त की हैं, जैसे कि आईडी वापस लौटाए गए 0 और 1 के बजाय 5 और 6 थे, तो क्या मैं 5 पास कर सकता था और 6 में glvertexAttribPointer() और glEnableVertexAttribArray() 0 और 1 के बजाय ??

उत्तर

13

glgetAttribLocation() सही सूचकांक देता है। तो हाँ, glVertexAttribPointer() और glEnableVertexAttribArray() में उन मानों का उपयोग करना सुरक्षित है।

लेकिन प्रत्येक शेडर के लिए glGetAttribLocation को कॉल करना महंगा हो सकता है यदि आप इसे कैश नहीं करते हैं। GlbindAttribLocation() का उपयोग एक सम्मेलन का उपयोग करने की अनुमति देता है, हमेशा 0 में स्थिति, सामान्य में 1 और इसी तरह की स्थिति।

संबंधित मुद्दे