程序,VAOS,VBOS,多个着色器

时间:2017-03-13 20:39:59

标签: opengl

我正在考虑一个场景,其中, 按下按钮时,会为某个对象使用不同的着色器
所以,我想知道gpu中的内存处理 我通常在任何glBufferData调用之前使用glUseProgram,
因为我通常将一个对象与一个程序联系起来
我现在需要更多的灵活性。我想知道,glBufferData是不是 填充GPU中的内存位置,任何程序都可以访问? 或者必须将glUseProgram称为1st,以便分配内存 那个特定的节目?

我不想两次传递相同的数据,每个节目一次 VAO是否同样与某个程序相关?
在我看来,它们应该是无关紧要的。由于glGetAttribLocation
将程序ID作为参数,应该足以指定
特定程序中对象的属性 但是,在这种情况下,我甚至不确定为什么会使用glUseProgram。

1 个答案:

答案 0 :(得分:0)

让我们说你想画一辆车。你有一个程序(比如,idP1 = 1),它使用VBO缓冲区buf1和buf2以及属性at1,at2。您将所需的绑定buf1和buf2存储在VAO(例如,vao1)中为at1和at2。在激活绘图之前,您激活了vao1和"使用"程序idP1。

现在你要画一个房子。它有自己的缓冲区buf3和at1属性(是的,与汽车相同)。您将buf3绑定的VAO(vao2)设置为at1。事实上,着色器程序与汽车相同。没问题。你激活vao2并使用idpP1。着色器将从buf3读取at1。 at2将不会被使用。

现在你要画一辆超级跑车。这需要一个不同的着色器。缓冲器与普通汽车buf1,buf2相同,加上新的buf4。并且它们以相同的方式在着色器中呈现。让我们通过属性at1,at2,at3来说。因此,您设置了一个新的VAO vao3,它可以为着色器中的不同位置设置绑定和属性。当你使用这个新程序(idP2)时,它用at1读取buf1,用at2读取buf2,用at3读取buf4。

请注意,缓冲区只填充一次(或多次填充,具体取决于它们的更改方式)。您可以在需要时创建和填充缓冲区,而在创建VAO时则不需要。但是VAO至少需要在之前创建缓冲区。