glUseProgram() 和 glUseShaderProgram() 有啥区别?

Posted

技术标签:

【中文标题】glUseProgram() 和 glUseShaderProgram() 有啥区别?【英文标题】:What is the difference between glUseProgram() and glUseShaderProgram()?glUseProgram() 和 glUseShaderProgram() 有什么区别? 【发布时间】:2015-06-15 18:44:51 【问题描述】:

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

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

【问题讨论】:

我从未听说过glUseShaderProgram(),包括在 GLEW 中。不能代表 MESA。为了迂腐,在 OpenGL 中 glUseShaderProgram() 不存在。 似乎 glew 1.10 定义了glUseShaderProgramEXT() glUseProgramObjectARB() 来自ARB_shader_objects @matth 是 OpenGL - 你的问题吗? glUseShaderProgramEXT() 来自EXT_separate_shader_objects 【参考方案1】:

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 上找到更多详细信息和示例代码。

【讨论】:

以上是关于glUseProgram() 和 glUseShaderProgram() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGl,glUseProgram() 返回 GL_INVALID_VALUE 即使着色器的 ID 是正确的 [重复]

glUniformBlockBinding 和 glBindBufferBase 之间的排序重要吗?

uniform

如何使用多个着色器程序? [关闭]

程序解绑再反弹后如何恢复属性绑定

Qt FrameBuffer 对象甚至不渲染顶点