当我查看OpenGL 4.5规范时,我注意到你可以通过调用以下命令来获取制服的位置:
glGetProgramResourceLocation(program, GL_UNIFORM, name);
这与以下非常相似:
glGetUniformLocation(program, name);
我想知道使用前者而不是后者是否有任何优势。
OpenGL的程序自省API设计得不是很好。它们从最初的3DLabs GLSL提案中半有机地发展而来。但最初的设计是基于仅查询属性/统一位置和统一资源。
随着 GLSL 的发展,它添加了更多种类的资源:UBO、着色器子例程、SSBO 等。此外,人们意识到查询片段着色器输出变量也很有用。
这导致了一个弗兰肯斯坦的API。每次他们添加新资源进行内省时,他们都必须添加更多 API 入口点。在OpenGL 4.3中,他们最终决定对整个系统进行大修。
通用程序自省系统可以查询旧查询可以执行的所有操作。该规范根据新的通用系统重新定义了旧查询。但是现在,当您向 OpenGL 添加新资源时,您只需要向现有的通用查询添加一些新的枚举器,而不是整个 API 函数。
只要您使用的是最新版本的 OpenGL,就应该使用较新的查询机制。如果没有其他原因,只是为了让你的代码看起来更统一。
前者等同于后者。
请参阅 OpenGL 4.6 API 核心配置文件规范;7.6. 统一变量;第134页:
此外,还提供了几个专用命令来查询 活跃的制服。命令
int GetUniformLocation( uint program, const char *name );
相当于
GetProgramResourceLocation(program, UNIFORM, name);