当我查看OpenGL 4.5规范时,我注意到您可以通过调用以下命令获取制服的位置:
glGetProgramResourceLocation(program, GL_UNIFORM, name);
与以下内容非常相似:
glGetUniformLocation(program, name);
我想知道使用前者代替后者是否有任何优势。
答案 0 :(得分:5)
OpenGL的program introspection APIs的设计不是很好。它们是从最初的3DLabs GLSL提议中半有机地增长的。但是最初的设计是基于仅查询属性/统一位置和统一资源。
随着GLSL的发展,它增加了 lot 种资源:UBO,着色器子例程,SSBO等。此外,人们意识到查询片段着色器的输出变量也很有用。
这导致了科学怪人的API。每次他们添加新的资源进行自省时,就不得不添加几个API入口点。在OpenGL 4.3中,他们最终决定只对整个系统进行大修。
generic program introspection system可以查询old queries could do的所有内容。并且该规范根据新的通用系统重新定义了旧查询。但是现在,当您将新资源添加到OpenGL时,只需要将几个新的枚举数添加到现有的通用查询中,而不是整个API函数。
只要您使用的是最新版本的OpenGL,就应该使用较新的查询机制。如果除了使您的代码看起来更加统一之外,没有其他原因。
答案 1 :(得分:2)
前者等同于后者。
请参见OpenGL 4.6 API Core Profile Specification; 7.6. UNIFORM VARIABLES; page 134:
此外,还提供了一些专用命令来查询以下内容的属性 活跃的制服。命令
int GetUniformLocation( uint program, const char *name );
等同于
GetProgramResourceLocation(program, UNIFORM, name);