我目前在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
?
答案 0 :(得分:2)
对渲染或统一更新没有影响
您所展示的代码中没有任何内容涉及"渲染"或者"统一更新"。如果你调用glUniform
,它将转到程序对象6,而不是管道中的任何东西(除非6恰好在管道中)。如果渲染,您将使用程序对象6中的着色器,而不是管道中的着色器(再次,除非6恰好在管道中)。
只要有正在使用的程序,管道就不会影响渲染。
还应注意glUseProgramStages
不会影响pipeline_ID
,因为它与上下文绑定。它会影响该管道,因为您将其作为参数传递。你没有必要先绑定它。实际上,绑定管道的唯一原因是使用它进行渲染;它的所有状态设置功能都使用DSA风格。