使用 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,就应该使用更新的查询机制。如果只是为了让您的代码看起来更统一。
当我查看 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,就应该使用更新的查询机制。如果只是为了让您的代码看起来更统一。