Graphics 使用glBindAttribLocation是否可以提高性能?
我的理解是,Graphics 使用glBindAttribLocation是否可以提高性能?,graphics,opengl-es-2.0,Graphics,Opengl Es 2.0,我的理解是,glbindAttributeLocation允许您自定义设置属性句柄(在链接着色器程序之前),稍后使用glvertexAttribute指针进行渲染时可以使用该句柄 但您不必使用它,而是可以依赖OpenGL在其无限的智慧中指定它选择的任何句柄。但是,在使用glvertexattributepointer进行渲染之前,您需要在某个点使用glgetAttributeLocation查询OpenGL以找到该句柄 现在,您可以在每次渲染时使用glgetAttriblation,这似乎是浪费
glbindAttributeLocation
允许您自定义设置属性句柄(在链接着色器程序之前),稍后使用glvertexAttribute指针进行渲染时可以使用该句柄
但您不必使用它,而是可以依赖OpenGL在其无限的智慧中指定它选择的任何句柄。但是,在使用glvertexattributepointer
进行渲染之前,您需要在某个点使用glgetAttributeLocation
查询OpenGL以找到该句柄
现在,您可以在每次渲染时使用glgetAttriblation
,这似乎是浪费,因为您可以在构建程序后只使用glgetAttriblation
一次,然后存储句柄
因此,本质上,您可以通过使用glbindAttriblation
或使用glgetAttriblation
来存储此句柄。因此,在性能方面是否存在任何差异,以及一种方法与另一种方法的优缺点是什么?我不能对直接的性能差异说太多,但无论如何它应该是无关的,因为无论是使用glbindattiblocation
还是glgetattiblocation
,您都是在初始化时进行的(即使调用glgetattiblocation
,也不会造成太大的伤害)
但是显式的glBindAttribLocation
与让GL决定的主要区别和优势在于,它允许您建立自己的属性语义,并为每个着色器保持一致
假设您有一大堆对象和一大堆着色器。但每个着色器都有一些位置属性(以及法线、颜色等)的概念,同样,每个对象都有位置、法线等的属性数据。。。现在,使用glBindAttribLocation
可以将位置属性绑定到每个不同着色器中的位置0。因此,当使用不同的着色器绘制对象时,它们可以使用单个顶点格式(即,如何为各个属性调用glvertexattributepointer
,以及各个启用调用)
另一方面,glGetAttriblLocation
并不能保证哪些属性得到哪些索引(可能一个着色器有一些附加属性,编译器认为这是重新排序它们的好方法,谁知道呢)。因此,在本例中,每个对象和每个着色器都有不同的顶点格式(glvertexattributepointer
call)
这在使用顶点数组对象(封装所有属性状态,尤其是glvertexattributepointer
和glenablevertexattributearray
调用)时更为重要。在这种情况下,每次使用其他着色器绘制对象时,通常不需要(也不希望)调用glvertexattributepointer
因此,底线是,始终使用glbindAttriblLocation
,充其量(在大型应用程序中)它可以为您节省许多对象和着色器管理问题,以及许多不必要的glvertexAttriblePointer
调用每个帧(这可能会提高性能),至少(在非常小的应用程序中)这是一个很好的实践,可以让您在扩展时保持开放性和灵活性。作为补充说明,在desktop GL 3+(或使用ARB_explicit_attrib_location扩展)中,您甚至可以直接在着色器中指定属性位置,而无需任何API调用