我不能多说直接的性能差异,但无论如何它应该是无关紧要的,因为无论是否使用glBindAttribLocation
or glGetAttribLocation
,无论如何你都是在初始化时进行的(即使这样调用glGetAttribLocation
也不应该有那么大的伤害)。
但是显式而不是让 GL 决定的主要区别和优势glBindAttribLocation
在于,它允许您建立自己的属性语义并保持它们对于每个着色器的一致性。
假设您有一大堆对象和一大堆着色器。但是每个着色器都有一些位置属性的概念(和法线,颜色,......),同样每个对象都有位置,法线的属性数据......现在glBindAttribLocation
你可以将你的位置属性绑定到每个位置的位置 0不同的着色器。因此,当使用不同的着色器绘制对象时,它们可以使用单一顶点格式(即,您如何调用glVertexAttribPointer
各个属性,以及各个启用调用)。
另一方面glGetAttribLocation
,不能保证哪些属性得到哪些索引(也许一个着色器有一些额外的属性,编译器认为这是对它们重新排序的好方法,谁知道呢)。glVertexAttribPointer
所以在这种情况下,每个对象和每个着色器都有不同的顶点格式(调用)。
glVertexAttribPointer
这在使用顶点数组对象(封装所有属性状态,尤其是andglEnableVertexAttribArray
调用)时更为重要。在这种情况下,您通常不需要(也不想)在glVertexAttribPointer
每次使用另一个着色器绘制对象时调用。
所以底线是,始终使用glBindAttribLocation
,充其量(在大型应用程序中)它可以为您节省许多对象和着色器管理问题以及glVertexAttribPointer
每帧许多不必要的调用(这可能是性能提升),并且至少(在一个非常小型应用程序)这是一种很好的做法,可以让您对扩展保持开放和灵活。附带说明一下,在桌面 GL 3+(或使用 ARB_explicit_attrib_location 扩展)中,您甚至可以直接在着色器中分配属性位置,而无需任何 API 调用。