我的理解是glBindAttribLocation
允许您自定义设置属性的句柄(在链接着色器程序之前),稍后您可以使用glVertexAttribPointer
进行渲染时使用该句柄。
但是你不必使用它,而是可以依靠OpenGL分配它所选择的任何句柄,以其无限的智慧。但是,在使用glGetAttribLocation
进行渲染之前,您需要在某个时刻使用glVertexAttribPointer
查询OpenGL以找出此句柄。
现在你可以在每次渲染时使用glGetAttribLocation
,这看起来很浪费,因为你可以在构建程序后使用glGetAttribLocation
一次,然后存储句柄。
基本上,您可以使用glBindAttribLocation
或使用glGetAttribLocation
存储此句柄,因此在性能方面是否存在任何差异,哪一方面的优缺点是什么?
答案 0 :(得分:7)
我不能谈论直接的性能差异,但无论如何它应该是无关紧要的,因为无论是使用glBindAttribLocation
还是glGetAttribLocation
,你都是在初始化时做的(无论如何)调用glGetAttribLocation
不应该伤害那么多。)
但显式glBindAttribLocation
优于让GL决定的主要区别和优势在于,它允许您建立自己的属性语义并使它们与每个着色器保持一致。
假设您拥有一大堆对象和一大堆着色器。但是每个着色器都有一些位置属性(正常,颜色,......)的概念,同样每个对象都有位置,法线的属性数据......现在使用glBindAttribLocation
可以将位置属性绑定到位置在每个不同的着色器中为0。因此,在使用不同着色器绘制对象时,它们可以使用单个顶点格式(即,如何为各个属性调用glVertexAttribPointer
,以及单个启用调用)。
另一方面,glGetAttribLocation
没有给出任何关于哪些属性获得哪些索引的保证(可能一个着色器具有一些额外属性,并且编译器认为这是重新排序它们的好方法,谁知道)。因此,在这种情况下,每个对象和都有不同的顶点格式(glVertexAttribPointer
调用)。
使用顶点数组对象(它封装了所有属性状态,尤其是glVertexAttribPointer
和glEnableVertexAttribArray
调用)时,这一点更为重要。在这种情况下,每次使用其他着色器绘制对象时,通常不需要(也不希望)调用glVertexAttribPointer
。
所以最重要的是,总是使用glBindAttribLocation
,最好(在大型应用程序中)它可以为您节省许多对象和着色器管理问题以及每个框架中的许多不必要的glVertexAttribPointer
调用(以及 可能是性能提升),至少(在一个非常小的应用程序中)这是一个很好的做法,让你保持开放和灵活的扩展。作为旁注,在桌面GL 3+(或使用ARB_explicit_attrib_location扩展)中,您甚至可以直接在着色器中分配属性位置,而无需任何API调用。