Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 如何在程序解除绑定后恢复属性绑定,然后重新绑定_Opengl_Opengl Es - Fatal编程技术网

Opengl 如何在程序解除绑定后恢复属性绑定,然后重新绑定

Opengl 如何在程序解除绑定后恢复属性绑定,然后重新绑定,opengl,opengl-es,Opengl,Opengl Es,我想知道如何在解除绑定和恢复程序时恢复所有属性绑定。据我所知,如果我使用VAO,它就像反弹VAO一样简单,但我不确定何时我不使用VAO。我正在创建VBO,但不是VAO 如果我这样做 glUseProgram(shader1); // Now set uniforms. glUniformMatrix4fv(matrix_handdle, 1, false, matrix); glBindBuffer(GL_ARRAY_BUFFER, bufferIndex); glEnableVertexA

我想知道如何在解除绑定和恢复程序时恢复所有属性绑定。据我所知,如果我使用VAO,它就像反弹VAO一样简单,但我不确定何时我不使用VAO。我正在创建VBO,但不是VAO

如果我这样做

glUseProgram(shader1);

// Now set uniforms.
glUniformMatrix4fv(matrix_handdle, 1, false, matrix);

glBindBuffer(GL_ARRAY_BUFFER, bufferIndex);
glEnableVertexAttribArray(m_attributes[position_1]);

glVertexAttribPointer(m_attributes[POSITION_HANDLE], 3, GL_FLOAT, false, 3 * sizeof(GLfloat), 0);
现在保存当前程序,vbo绑定。然后使用第二个程序

glUseProgram(shader2);
//bind some new  vbo, set some uniform, vertex attribute variable.
element.draw();
然后再次使用第一个着色器程序。重新绑定vbo

glUseProgram(shader1); //Here, do the attributes set in first shader program remain?
element.draw();

我想我需要使用glGetVertexAttrib()函数获取所有顶点属性的大小、步长、类型、规格化标志、缓冲区绑定和数组指针的顶点属性值,并保存它们。然后,当我重新绑定程序时,我将设置顶点属性值。我想我需要通过使用GL_Max_VERTEX_ATTRIBS获取着色器程序的Max属性,然后保存/恢复所有属性位置的值。这是正确的还是我在某个地方错了?

您可以使用
glvertexattributepointer
定义如何将VBO数据绑定到着色器调用。因此,您可以调用
glvertexattributepointer
一次或多次,例如。G定义顶点位置、法线和纹理数据,然后绘制

VAO的目的是避免多次调用
glvertexattributepointer
的麻烦。在绘制之前,不必调用
glvertexattributepointer
,而是将状态存储在VAO中,然后只需调用
glBindVertexArray即可​绘制前一次。所以VAO的全部意义在于,您自己不必存储状态,而是让VAO来处理它。有很多关于如何做到这一点的教程

只要着色器使用相同的输入格式,就可以使用具有相同VAO的多个着色器

旁注:请试着一次问一个问题。谢谢。:)

现在保存当前程序,vbo绑定

程序对象没有绑定到它们的缓冲区。曾经除编译程序外,程序对象的唯一状态是统一状态

顶点数组不是统一的

用于顶点数据的缓冲区可以存储在顶点数组对象(VAO)中。如果您没有访问VAOs的权限,则必须在每次要使用这些缓冲区进行渲染时重置此状态。这意味着您每次都必须执行
glBindBuffer
glenablevertexattributearray
glvertexattributepointer
调用


VAO的存在是为了避免这样做。但是,如果您无法访问它们,那么您就应该使用您所拥有的。

我的问题是关于我不使用VAO时的情况。我只是在使用VBO。我想我需要获取GL_MAX_VERTEX_ATTRIBS,并存储所有顶点属性的大小、步长、类型、规格化标志、缓冲区绑定和数组指针,然后保存。然后,当我重新绑定着色器程序时,再次使用glVertexAttribPointer设置顶点属性值。这是正确的还是我在某个地方错了?但是。首先设置这些属性的是谁?我认为你的程序中已经有了所有的信息。您是否正在尝试构建一个实现VAOs的库?为什么?已经有一个了,它叫做OpenGL 3.0这些值将由使用库的用户设置。是的,你是对的,我正在尝试VAO为你做的事情。如果有人使用opengl 2.0,我需要这样做。我已经更新了我的问题。请看一看。我有一些很好的答案。我想强调的是,您应该在阅读OpenGL规范,尤其是在编写库时。