glUseProgram(0)有什么作用?

use*_*171 18 opengl api shader

OpenGL文档glUseProgram声称,使用参数调用它将导致着色器执行的结果undefined.

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

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

Nic*_*las 22

glUseProgram表示给定的程序对象是将用于使用程序(glUniform,渲染命令等)的事物的当前程序.0与NULLOpenGL对象非常相似.它代表not an object(对于大多数对象).因此,glUseProgram意味着没有程序是最新的,因此没有程序将用于使用程序的东西.

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

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

  • @ user11171:不会.当你想要没有绑定程序时,你应该调用它.通过这样做,您可以防止意外地使用非预期的程序进行渲染(即:您忘记使用您想要的实际程序调用`glUseProgram`).您通常会在渲染完成后调用它. (7认同)

Sys*_*dox 6

与这里和其他地方的许多答案相反,glUseProgram(0) 不会恢复到固定功能模式。以这种方式使用它是不安全的。您可以使用它来将渲染状态设置为无效的程序对象,但如果在渲染发生时它仍然绑定到 this,则行为是未定义的

来自文档

“如果程序为零,则当前渲染状态引用无效的程序对象,并且着色器执行的结果为 undefined

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

  • glUseProgram(0) 是完全安全的。正如该页面所说,调用 glUseProgram(0); 不是错误。只渲染任何没有程序限制的东西。这仅适用于核心配置文件。 (6认同)