【问题标题】:OpenGL binding shader stages and programs confusionOpenGL绑定着色器阶段和程序混淆
【发布时间】:2017-09-21 15:17:39
【问题描述】:

我目前在 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);

在调用glUseProgramPipeline 之前没有先设置glUseProgram(0)。我认为的文档暗示它不起作用,但我可以像这样渲染得很好。调用glBindProgramPipeline之前需要设置glUseProgram(0)吗?

【问题讨论】:

  • @BDL 哦,我明白了,我没这么理解。希望有人能澄清一下。

标签: opengl shader


【解决方案1】:

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

您显示的代码中没有任何内容涉及“渲染”或“统一更新”。如果您调用glUniform,它将转到程序对象 6,而不是流水线中的任何东西(除非 6 恰好在流水线中)。如果进行渲染,您将使用程序对象 6 中的着色器,而不是管道中的着色器(同样,除非 6 恰好在管道中)。

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

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

【讨论】:

  • 谢谢,所以在附加着色器阶段之前绑定管道是不必要的。如果我理解正确,如果绑定了着色器程序 6,并且我将片段和顶点着色器附加到管道,那么下一次调用将使用着色器程序 6。我首先需要绑定管道。但是,正如我最初的问题所问的那样,在绑定我的管道之前是否必须先将 glUseProgram 设置为 (0) ?我猜不是。
  • @Zebrafish:您的问题就像是在问“在设置指针变量 B 之前,我是否必须将指针变量 A 设置为 NULL?”
  • 我刚刚测试了一些东西,我发现绑定着色器管道真的很慢,而将着色器阶段附加到它几乎可以忽略不计。绑定管道似乎比纹理切换或绑定 VBO 更能减慢我的系统速度。很奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-15
  • 1970-01-01
相关资源
最近更新 更多