2011-09-28 60 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等等。