The OpenGL docs for glUseProgram
声称使用参数 zero 调用它会导致着色器执行的结果为undefined
。
但是,经过一番搜索后,我看到了一些人使用glUseProgram
卸载当前着色器程序的例子。
这种行为可靠吗?如果没有,那么glUseProgram(0)
究竟做了什么?
答案 0 :(得分:21)
glUseProgram
表示给定的程序对象是将用于使用程序(glUniform
,渲染命令等)的当前程序。 0与OpenGL对象的NULL
非常相似。它代表not an object
(对于大多数对象)。因此,glUseProgram
表示 no 程序是最新的,因此没有程序将用于使用程序的程序。
如果在没有程序当前时尝试调用glUniform
函数,它们将失败并显示错误。如果您尝试在没有程序当前时进行渲染,则会发生以下两种情况之一。
GL_INVALID_OPERATION
错误,因为核心OpenGL 必须使用程序进行渲染。答案 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(...)