The OpenGL docs for glUseProgram
声明,使用参数 zero 调用它将导致着色器执行的结果为undefined
。
然而,经过一点搜索,我看到了一些人使用glUseProgram
来 * 卸载 * 当前着色器程序的例子。
这种行为可靠吗?如果不可靠,那么glUseProgram(0)
到底做了什么?
The OpenGL docs for glUseProgram
声明,使用参数 zero 调用它将导致着色器执行的结果为undefined
。
然而,经过一点搜索,我看到了一些人使用glUseProgram
来 * 卸载 * 当前着色器程序的例子。
这种行为可靠吗?如果不可靠,那么glUseProgram(0)
到底做了什么?
4条答案
按热度按时间57hvy0tb1#
glUseProgram
表示给定的程序对象是当前程序,将用于使用程序的对象(glUniform
、渲染命令等)。0与OpenGL对象的NULL
非常相似。它表示不是对象(对于大多数对象)。因此,glUseProgram(0)
表示 * 没有 * 程序是当前的,因此没有程序将用于使用程序的对象。如果您尝试在没有最新程序的情况下调用
glUniform
函数,它们将失败并出现错误。如果您尝试在没有最新程序的情况下进行渲染,将发生以下两种情况之一。在OpenGL 3.1+的核心配置文件中,您将得到未定义的行为,因为核心OpenGL * 必须 * 使用程序进行渲染。在兼容性配置文件或3.0或更低版本中,您将得到固定函数渲染。798qvoo82#
与这里和其他地方的很多答案相反,
glUseProgram(0)
不会恢复到固定函数模式。以这种方式使用它是不安全的。您可以使用它将渲染状态设置为无效的程序对象,但是如果在渲染发生时它仍然绑定到这个对象,则行为是undefined。从doc:
如果program为零,则当前渲染状态引用无效的程序对象,着色器执行的结果为
undefined
因此,结果完全取决于操作系统、驱动程序和显卡。在许多情况下,它似乎会恢复到固定功能模式,但这不是规范中定义的,不应依赖。它可能很容易保留最后一个着色器,渲染垃圾,或导致segfault(我见过这种情况)。
cwdobuhd3#
它告诉OpenGL使用固定函数管道。
yzuktlbb4#
使用
glUseProgram(myShader)
后,所有后续渲染都将使用着色器IDmyShader
完成。如果每次在
modern openGL 3.1+
中进行材料更改时都调用此函数,则glUseProgram(0)
几乎没有用处。但是,如果您计划在其中集成一些固定函数渲染,如
glVertex3f(..)
,则glUseProgram(0)
将确保上次使用的着色器不再处于活动状态,并且它将使用固定函数管道,如glColor3f(...)