GLES2 是否必须使用 glBindAttribLocation() 函数?

11

这可能是一个初学者问题。据我理解,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);

到目前为止,我理解传递给glVertexAttribPointer()的第一个参数是0和1的ID。

如果我通过glGetAttribLocation()调用获得属性的位置ID(如上所述),假设返回的ID是5和6而不是0和1,那么将5和6替换0和1传递给glVertexAttribPointer()和glEnableVertexAttribArray()是否安全可行?

1个回答

13

glGetAttribLocation() 返回正确的索引值。因此,在 glVertexAttribPointer() 和 glEnableVertexAttribArray() 中使用这些值是安全的。

但是,如果您不缓存它,为每个着色器调用 glGetAttribLocation 可能会很昂贵。使用 glBindAttribLocation() 允许使用惯例,例如将位置始终设置为0,法线为1等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接