glUseProgram() 和 glUseShaderProgram() 有什么区别?

What is the difference between glUseProgram() and glUseShaderProgram()?

本文关键字:区别 什么 glUseShaderProgram glUseProgram      更新时间:2023-10-16

在OpenGL中,glUseProgram()glUseShaderProgram()有什么区别?

似乎在MESA和Nvidia中提供了glext.h,而在GLEW中,两者都是定义的,并且似乎都做了基本相同的事情。我找到glUseProgram()的文档,但没有找到glUseShaderProgram()的文档。它们真的可以互换吗?

glUseShaderProgramEXT()是EXT_separate_shader_objects扩展的一部分。

此扩展在获得 ARB 状态的版本中发生了重大更改,为 ARB_separate_shader_objects。想法仍然相同,但 API 看起来完全不同。扩展规范对此进行了评论:

此扩展基于 EXT_separate_shader_objects 提供的概念验证构建,该验证证明了单独的着色器对象可用于 GLSL。

此 ARB 版本解决了先前 EXT 扩展中的几个"松散端"。

该扩展的ARB版本随后被采用为OpenGL 4.1的核心功能。如果有兴趣使用此功能,首选方法是使用 4.1 中的核心入口点。

所有这些都为您提供了一种避免将所有阶段的着色器链接到单个程序中的方法。相反,您可以创建仅包含阶段子集着色器的程序对象。然后,您可以混合和匹配来自不同程序的着色器,而无需重新链接它们。为了跟踪使用哪些程序的着色器,引入了一种称为"程序管道"的新型对象。

详细解释这一点超出了本答案的范围。您将使用 glCreateProgramPipelines()glBindProgramPipeline()glUseProgramStages() 等调用。您可以在 OpenGL wiki 上找到更多详细信息和示例代码。