使用glGetProgramResourceLocation代替glGetUniformLocation有优势吗?

时间:2018-10-03 18:53:18

标签: opengl opengl-4

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

glGetProgramResourceLocation(program, GL_UNIFORM, name);

与以下内容非常相似:

glGetUniformLocation(program, name);

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

2 个答案:

答案 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);