glUseProgram(0)有什么作用?

时间:2012-11-24 22:50:56

标签: api opengl shader

The OpenGL docs for glUseProgram声称使用参数 zero 调用它会导致着色器执行的结果为undefined

但是,经过一番搜索后,我看到了一些人使用glUseProgram 卸载当前着色器程序的例子。

这种行为可靠吗?如果没有,那么glUseProgram(0)究竟做了什么?

4 个答案:

答案 0 :(得分:21)

glUseProgram表示给定的程序对象是将用于使用程序(glUniform,渲染命令等)的当前程序。 0与OpenGL对象的NULL非常相似。它代表not an object(对于大多数对象)。因此,glUseProgram表示 no 程序是最新的,因此没有程序将用于使用程序的程序。

如果在没有程序当前时尝试调用glUniform函数,它们将失败并显示错误。如果您尝试在没有程序当前时进行渲染,则会发生以下两种情况之一。

  • OpenGL 3.1+,核心配置文件中,您将收到GL_INVALID_OPERATION错误,因为核心OpenGL 必须使用程序进行渲染。
  • 兼容性配置文件或3.0或更低版本中,您将获得固定功能渲染。

答案 1 :(得分:3)

与此处和其他地方的许多答案相反,glUseProgram(0)并不安全。您可以使用它将渲染状态设置为无效的程序对象,但如果在渲染时它仍然与此绑定,则行为未定义

这可能有助于避免错误地使用错误的程序,但您不应将其用于表示“使用固定功能模式”。在大多数情况下,这是发生的事情,但它不是由规范定义的,不应该依赖。

来自doc

  

“如果程序为零,则当前渲染状态指的是   无效的程序对象和着色器执行的结果是   undefined

因此,结果完全针对操作系统,驱动程序和显卡。在许多情况下,它似乎恢复到固定功能模式。但是,它可以很容易地保留最后一个着色器,渲染垃圾,或导致段错误(我已经看到过这种情况)。

答案 2 :(得分:2)

它告诉OpenGL使用固定功能管道。

答案 3 :(得分:0)

使用glUseProgram(myShader)后,所有后续渲染都将使用着色器ID myShader完成。

如果您每次modern openGL 3.1+进行重大更改时都在调用此内容,则glUseProgram(0)几乎没有使用。

但是,如果您计划在其中集成一些固定功能渲染,例如glVertex3f(..),那么glUseProgram(0)将确保最后使用的着色器不再处于活动状态,并且它将使用固定功能管道,如glColor3f(...)