OpenGL绑定着色器阶段和程序混乱

时间:2017-09-21 15:17:40

标签: opengl shader

我目前在OpenGL(可分离的着色器阶段)中使用着色器管道对象以及带有glUseProgram()的旧式单个程序。我想知道,在文档中说:

If there is a current program object established by `glUseProgram`, 
the bound program pipeline object has no effect on rendering or uniform updates.

这让我感到困惑,因为我似乎能够这样做:

glUseProgram(6); // Render using the single program
glBindProgramPipeline(pipeline_ID);
glUseProgramStages(pipeline_ID, GL_VERTEX_SHADER_BIT, shaderID);
glUseProgramStages(pipeline_ID, GL_FRAGMENT_SHADER_BIT, shaderID);

在调用glUseProgram(0)之前未先设置glUseProgramPipeline。我认为的文档暗示它不会起作用,但我可以像这样渲染。是否有必要在致电glUseProgram(0)之前设置glBindProgramPipeline

1 个答案:

答案 0 :(得分:2)

  

对渲染或统一更新没有影响

您所展示的代码中没有任何内容涉及"渲染"或者"统一更新"。如果你调用glUniform,它将转到程序对象6,而不是管道中的任何东西(除非6恰好在管道中)。如果渲染,您将使用程序对象6中的着色器,而不是管道中的着色器(再次,除非6恰好在管道中)。

只要有正在使用的程序,管道就不会影响渲染。

还应注意glUseProgramStages不会影响pipeline_ID,因为它与上下文绑定。它会影响该管道,因为您将其作为参数传递。你没有必要先绑定它。实际上,绑定管道的唯一原因是使用它进行渲染;它的所有状态设置功能都使用DSA风格。