gpt4 book ai didi

graphics - 使用 glBindAttribLocation 会提高性能吗?

转载 作者:行者123 更新时间:2023-12-04 23:56:27 26 4
gpt4 key购买 nike

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

但是您不必使用它,而可能只是依靠 OpenGL 分配它在其无限智慧中选择的任何句柄。但是,您需要使用 glGetAttribLocation 查询 OpenGL 以找出该句柄。在使用 glVertexAttribPointer 渲染之前的某个时间点.

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

所以本质上,你可以使用 glBindAttribLocation 来存储这个句柄。或使用 glGetAttribLocation那么在性能方面有什么区别吗?两者之间的优缺点是什么?

最佳答案

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

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

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

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

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

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

关于graphics - 使用 glBindAttribLocation 会提高性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15784266/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com