问题 GLES2是否需要glBindAttribLocation()?


这可能是一个菜鸟问题。据我所知,glBindAttribLocation(...,AAA,...)将程序内的属性绑定到AAA的位置ID,只要AAA是独一无二的。如果我有以下代码:

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);

到这一点,我明白的0和1的ID被()传递到glVertexAttribPointer作为第一个参数。

会是安全的假设,如果我通过glGetAttribLocation获得的属性的位置标识(如上述)()调用,使得所述的ID返回分别为5和6,而不是0和1,我能通过5和6成glVertexAttribPointer( )和glEnableVertexAttribArray()而不是0和1 ??


8439
2017-09-28 01:34


起源



答案:


glGetAttribLocation()返回正确的索引。所以,是的,它是安全的glVertexAttribPointer()和glEnableVertexAttribArray()来使用这些值。

但是如果不缓存它,为每个着色器调用glGetAttribLocation可能会很昂贵。使用glBindAttribLocation()允许使用惯例,在0总是位置,在正常1等。


13
2017-10-04 13:59