使用glBindAttribLocation可以提高性能吗?

joh*_*ers 4 graphics opengl-es-2.0

我的理解是glBindAttribLocation允许您自定义设置属性的句柄(在链接着色器程序之前),以后可以在渲染时使用glVertexAttribPointer.

但是你不必使用它,而是可以依靠OpenGL分配它所选择的任何句柄,以其无限的智慧.但是,您需要通过glGetAttribLocation在渲染之前的某个时刻使用查询OpenGL来查找此句柄glVertexAttribPointer.

现在你可以在glGetAttribLocation每次渲染时使用,这看起来很浪费,因为你可以glGetAttribLocation在构建程序后使用一次,然后存储句柄.

基本上,您可以通过使用glBindAttribLocation或使用来存储此句柄,glGetAttribLocation因此在性能方面是否有任何差异,哪一方面的优缺点是什么?

Chr*_*ica 7

我不能谈论直接的性能差异,但它无论如何都应该是无关紧要的,因为无论是否使用glBindAttribLocation或者glGetAttribLocation你无论如何都是在初始化时做的(甚至那时调用glGetAttribLocation也不应该那么大).


但明确glBindAttribLocation过度让GL决定的主要区别和优点是,它允许您建立自己的属性语义并使它们与每个着色器保持一致.

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

另一方面glGetAttribLocation,没有给出任何关于哪些属性获得哪些索引的保证(可能一个着色器具有一些额外属性,并且编译器认为这是重新排序它们的好方法,谁知道).因此,在这种情况下glVertexAttribPointer,每个对象每个着色器都有不同的顶点格式(调用).

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


所以底线是,总是使用glBindAttribLocation,充其量(在大型应用程序中)它可以为您节省许多对象和着色器管理问题以及glVertexAttribPointer每帧的许多不必要的调用(可能是性能提升),至少(在一个非常小应用程序)这是一个很好的做法,让您保持开放和灵活的扩展.作为旁注,在桌面GL 3+(或使用ARB_explicit_attrib_location扩展名)中,您甚至可以直接在着色器中分配属性位置,而无需任何API调用.