1

如果我理解正确,一些 OpenGL 状态依赖于其他状态:

glUseProgram(program1);
glUniform1i(program1Uniform1, x);
glUseProgram(program2);
glUniform1i(program2Uniform1, y);
glUseProgram(program1);

在这段代码片段的末尾,uniformprogram1仍然设置为x,即使program1Uniform1与 具有相同的索引program2Uniform1。所以,第二次调用glUniform1i不会覆盖第一次调用,因为我们已经在两次调用之间切换了着色器程序。

到目前为止是正确的吗?

如果它是正确的,那么统一状态对程序状态有某种依赖性,因为如果我们通过调用来切换程序glUseProgram()统一状态就会隐式改变。

是否有列出这些依赖项的书或网站?

我想我理解着色器程序、FBO、VBO、VAO、制服、属性等的概念,但我仍然很难将它们放在一起。我总是问自己“我必须在切换状态 A 之后切换状态 B,还是状态 B 依赖于状态 A?”

4

2 回答 2

1

到目前为止是正确的吗?

是的。制服是每个程序状态

如果我们通过调用 glUseProgram() 来切换程序,则统一状态会隐式更改。

嗯,不是真的。由于制服是每个程序状态的,因此根本不会改变制服状态。只是当前的程序发生了变化。

是否有列出这些依赖项的书或网站?

这些东西的权威来源是OpenGL 规范,特别是在第 23 章“状态表”中查看。

于 2013-07-26T12:53:40.153 回答
1

到目前为止是正确的吗?

是的。

如果它是正确的,那么统一状态对程序状态有某种依赖,因为如果我们通过调用 glUseProgram() 切换程序,统一状态会隐式改变。

好吧,从概念上讲,统一状态并不依赖于程序状态,而是统一状态是程序状态的一部分。当程序切换时,没有独立的统一状态会神奇地切换,只有单个程序的统一值(当前活动程序的值可以通过 API 访问)。

是否有列出这些依赖项的书或网站?

好吧,你最喜欢的 OpenGL 教程或书籍应该已经详细地告诉你各个对象类型、它们封装的状态以及它们如何相互交互。除此之外,OpenGL 规范当然是硬道理。

于 2013-07-26T12:51:36.863 回答