5

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

但是您不必使用它,而可能只是依靠 OpenGL 分配它在其无限智慧中选择的任何句柄。但是,您需要在glGetAttribLocation使用glVertexAttribPointer.

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

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

4

1 回答 1

8

我不能多说直接的性能差异,但无论如何它应该是无关紧要的,因为无论是否使用glBindAttribLocationor glGetAttribLocation,无论如何你都是在初始化时进行的(即使这样调用glGetAttribLocation也不应该有那么大的伤害)。


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

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

另一方面glGetAttribLocation,不能保证哪些属性得到哪些索引(也许一个着色器有一些额外的属性,编译器认为这是对它们重新排序的好方法,谁知道呢)。glVertexAttribPointer所以在这种情况下,每个对象每个着色器都有不同的顶点格式(调用)。

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


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

于 2013-04-03T13:21:26.560 回答