Graphics 使用glBindAttribLocation是否可以提高性能?

Graphics 使用glBindAttribLocation是否可以提高性能?,graphics,opengl-es-2.0,Graphics,Opengl Es 2.0,我的理解是,glbindAttributeLocation允许您自定义设置属性句柄(在链接着色器程序之前),稍后使用glvertexAttribute指针进行渲染时可以使用该句柄 但您不必使用它,而是可以依赖OpenGL在其无限的智慧中指定它选择的任何句柄。但是,在使用glvertexattributepointer进行渲染之前,您需要在某个点使用glgetAttributeLocation查询OpenGL以找到该句柄 现在,您可以在每次渲染时使用glgetAttriblation,这似乎是浪费

我的理解是,
glbindAttributeLocation
允许您自定义设置属性句柄(在链接着色器程序之前),稍后使用
glvertexAttribute指针进行渲染时可以使用该句柄

但您不必使用它,而是可以依赖OpenGL在其无限的智慧中指定它选择的任何句柄。但是,在使用
glvertexattributepointer
进行渲染之前,您需要在某个点使用
glgetAttributeLocation
查询OpenGL以找到该句柄

现在,您可以在每次渲染时使用
glgetAttriblation
,这似乎是浪费,因为您可以在构建程序后只使用
glgetAttriblation
一次,然后存储句柄


因此,本质上,您可以通过使用
glbindAttriblation
或使用
glgetAttriblation
来存储此句柄。因此,在性能方面是否存在任何差异,以及一种方法与另一种方法的优缺点是什么?

我不能对直接的性能差异说太多,但无论如何它应该是无关的,因为无论是使用
glbindattiblocation
还是
glgetattiblocation
,您都是在初始化时进行的(即使调用
glgetattiblocation
,也不会造成太大的伤害)


但是显式的
glBindAttribLocation
与让GL决定的主要区别和优势在于,它允许您建立自己的属性语义,并为每个着色器保持一致

假设您有一大堆对象和一大堆着色器。但每个着色器都有一些位置属性(以及法线、颜色等)的概念,同样,每个对象都有位置、法线等的属性数据。。。现在,使用
glBindAttribLocation
可以将位置属性绑定到每个不同着色器中的位置0。因此,当使用不同的着色器绘制对象时,它们可以使用单个顶点格式(即,如何为各个属性调用
glvertexattributepointer
,以及各个启用调用)

另一方面,
glGetAttriblLocation
并不能保证哪些属性得到哪些索引(可能一个着色器有一些附加属性,编译器认为这是重新排序它们的好方法,谁知道呢)。因此,在本例中,每个对象和每个着色器都有不同的顶点格式(
glvertexattributepointer
call)

这在使用顶点数组对象(封装所有属性状态,尤其是
glvertexattributepointer
glenablevertexattributearray
调用)时更为重要。在这种情况下,每次使用其他着色器绘制对象时,通常不需要(也不希望)调用
glvertexattributepointer


因此,底线是,始终使用
glbindAttriblLocation
,充其量(在大型应用程序中)它可以为您节省许多对象和着色器管理问题,以及许多不必要的
glvertexAttriblePointer
调用每个帧(这可能会提高性能),至少(在非常小的应用程序中)这是一个很好的实践,可以让您在扩展时保持开放性和灵活性。作为补充说明,在desktop GL 3+(或使用ARB_explicit_attrib_location扩展)中,您甚至可以直接在着色器中指定属性位置,而无需任何API调用