使用 glGetProgramResourceLocation 而不是 glGetUniformLocation 有优势吗?

Is there an advantage of using glGetProgramResourceLocation instead glGetUniformLocation?

当我查看 OpenGL 4.5 规范时,我注意到您可以通过调用以下方法获取制服的位置:

glGetProgramResourceLocation(program, GL_UNIFORM, name);

非常类似于:

glGetUniformLocation(program, name);

我想知道使用前者而不是后者是否有任何优势。

前者等同于后者

OpenGL 4.6 API Core Profile Specification; 7.6. UNIFORM VARIABLES; page 134:

Additionally, several dedicated commands are provided to query properties of active uniforms. The command

int GetUniformLocation( uint program, const char *name );

is equivalent to

GetProgramResourceLocation(program, UNIFORM, name);  

OpenGL 的 program introspection APIs 设计得不是很好。它们从最初的 3DLabs GLSL 提案中半有机地发展而来。但最初的设计是基于仅查询 attribute/uniform 位置和统一资源。

随着 GLSL 的发展,它添加了很多 种资源:UBO、着色器子例程、SSBO 等。此外,人们意识到查询片段着色器输出变量也很有用。

这导致了弗兰肯斯坦的 API。每次他们添加新资源进行内省时,他们都必须再添加几个 API 入口点。在 OpenGL 4.3 中,他们最终决定彻底改造整个系统。

generic program introspection system can query everything the old queries could do。该规范根据新的通用系统重新定义了旧查询。但是现在,当您向 OpenGL 添加新资源时,只需向现有的通用查询添加几个新的枚举器,而不是整个 API 个函数。

只要您使用的是最新版本的 OpenGL,就应该使用更新的查询机制。如果只是为了让您的代码看起来更统一。