OpenGL为什么要取消选择着色器程序?

4

可能是重复问题:
是否需要使用glDisableClientState?

在OpenGL中,我经常看到以下遵循这种模式的代码:

glUseProgram(prog_id);
// ... do some stuff
glUseProgram(0);

我知道glUseProgram(0)可以取消选择任何着色器程序。那么我的问题是取消选择着色器程序是什么意思?
例如,在渲染循环中,为什么应该或不应该这样做?
while(render_loop_condition)
{
    glUseProgram(prog_id);
    // do some stuff
}
// various cleanup code
glUseProgram(0);

在使用多个着色器程序的渲染循环中,我能像这样做吗:
while(render_loop_condition)
{
    glUseProgram(prog_id1);
    // do some stuff
    glUseProgram(prog_id2);
    // do some other stuff
}
// various cleanup code
glUseProgram(0);

glUseProgram(0) 不会取消选择着色器程序。根据 OpenGL 规范,其结果是“未定义的”(http://www.opengl.org/sdk/docs/man/xhtml/glUseProgram.xml)。 - SystemParadox
在某种程度上,确实如此。glUseProgram(0)选择了一个无效的程序。这类似于在使用完指针后将其设置为null的概念。只有执行无效程序才会导致未定义的行为,但是您可以使用glGet(GL_CURRENT_PROGRAM)来确定当前着色器程序是什么,或者如果没有则为0。该语句旨在澄清,处理如果当前未选择任何着色器程序时应该做什么不应依赖于在执行无效程序时引发某些错误/异常。 - helloworld922
1个回答

5

它用于避免在之后绘制的内容上产生任何意外的副作用。在方法内部切换程序是完全可以的(并且我认为更好),但最好在方法的末尾选择默认程序 (0)。这样,在调用该方法后,您就不会遇到任何奇怪的副作用。

我想不出有很多副作用,但我猜如果您以固定功能方式绘制某些东西,您会意外地使用上一个已绑定的程序进行绘制。

另外请注意,对于您发布的第二个代码块,您可以将第一个 glUseProgram 调用移动到 while 循环之外,以防止多次绑定相同的程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接