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