2011-09-28 43 views
11

這可能是一個菜鳥問題。據我瞭解,只要AAA是唯一的,glBindAttribLocation(...,AAA,...)將把程序中的一個屬性綁定到AAA的位置ID。如果我有下面的代碼:GLES2是glBindAttribLocation()必需的嗎?

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

這將結合我的兩個變量的位置ID 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); 

到現在爲止,我明白的ID作爲第一個參數,將0和1傳入glVertexAttribPointer()。

假設如果我通過glGetAttribLocation()調用獲得了屬性的位置ID(如上所示),使得返回的ID是5和6而不是0和1,我可以安全地通過5和6變成glVertexAttribPointer()和glEnableVertexAttribArray()而不是0和1?

回答

13

glGetAttribLocation()返回正確的索引。所以是的,在glVertexAttribPointer()和glEnableVertexAttribArray()中使用這些值是安全的。

但是,如果不緩存它,爲每個着色器調用glGetAttribLocation可能會很昂貴。使用glBindAttribLocation()允許使用約定,始終位於0,常規位於1等等。