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

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

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

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

glUseShaderProgramEXT()EXT_separate_shader_objects 扩展的一部分。

此扩展在获得 ARB 状态 ARB_separate_shader_objects 的版本中发生了重大变化。想法还是一样的,但是 API 看起来很不一样。扩展规范对此评论:

This extension builds on the proof-of-concept provided by EXT_separate_shader_objects which demonstrated that separate shader objects can work for GLSL.

This ARB version addresses several "loose ends" in the prior EXT extension.

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

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

详细解释这个超出了这个答案的范围。您将使用 glCreateProgramPipelines()glBindProgramPipeline()glUseProgramStages() 等调用。您可以在 OpenGL wiki.

上找到更多详细信息和示例代码