Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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_Glsl - Fatal编程技术网

Opengl 当着色器解除绑定时,制服设置和顶点属性值是否保持不变

Opengl 当着色器解除绑定时,制服设置和顶点属性值是否保持不变,opengl,opengl-es,glsl,Opengl,Opengl Es,Glsl,我想知道如果着色器程序解除绑定,然后反弹,均匀属性和顶点属性变量值是否保持不变 基本上我想问这个问题。但我想知道这是否适用于制服和属性变量 如果我这样做 glUseProgram(shader1); // Now set uniforms. glUniform4fv(m_uniforms[COLOR_HANDLE], 1, color.AsFloat()); glUniformMatrix4fv(m_uniforms[MVP_HANDLE], 1, false,

我想知道如果着色器程序解除绑定,然后反弹,均匀属性和顶点属性变量值是否保持不变

基本上我想问这个问题。但我想知道这是否适用于制服和属性变量

如果我这样做

    glUseProgram(shader1);
    // Now set uniforms.
    glUniform4fv(m_uniforms[COLOR_HANDLE], 1, color.AsFloat());
    glUniformMatrix4fv(m_uniforms[MVP_HANDLE], 1, false, matrix);

    glBindBuffer(GL_ARRAY_BUFFER, bufferIndex);
    glEnableVertexAttribArray(m_attributes[POSITION_HANDLE1]);
    glEnableVertexAttribArray(m_attributes[POSITION_HANDLE2]);

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

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

    glUseProgram(shader1); //Here, do the uniforms and attributes set in first shader program remain?
    element.draw();
这是否意味着已恢复完整状态,并且draw调用将正常工作。我认为如果制服和属性值被保留,这应该是可行的。所以,当我用GluseProgramm恢复客户端程序时,客户端设置的所有制服和属性都将被恢复

如果没有,那么如何保存完整状态。一件事是客户端必须重新设置它们。但如果这不是一种选择,那么反过来又是什么呢。如何保存完整状态并在以后恢复。有可能吗


PS:我需要为opengl 2.0、opengl 3.2+、opengl es 2.0、opengles 3.0做这件事

制服是着色器程序对象的一部分。因此,即使程序对象未绑定,它们也会保持保存状态。政府对此表示:

7.6统一变量

默认统一块中的统一(子例程统一除外)为 程序对象特定状态。它们在加载后保留其值,并且 每当使用程序对象时,只要该程序对象 没有重新链接

属性


属性绑定是VAO状态的一部分。如果未绑定VAO,则使用默认VAO(顺便说一句,核心配置文件中不允许)。使用VAO时,恢复属性绑定非常简单,因为它足以重新绑定VAO。在另一种情况下,我将查看“关联的get”部分。

制服

制服是着色器程序对象的一部分。因此,即使程序对象未绑定,它们也会保持保存状态。政府对此表示:

7.6统一变量

默认统一块中的统一(子例程统一除外)为 程序对象特定状态。它们在加载后保留其值,并且 每当使用程序对象时,只要该程序对象 没有重新链接

属性


属性绑定是VAO状态的一部分。如果未绑定VAO,则使用默认VAO(顺便说一句,核心配置文件中不允许)。使用VAO时,恢复属性绑定非常简单,因为它足以重新绑定VAO。在另一种情况下,我会看一看“关联的GET”部分。

“现在,如果我还原程序和vbo,vao正在使用,这是否意味着完整的状态被还原,客户端可以继续进行绘制调用。”你说的“还原”是什么意思?在哪里恢复?您是在谈论重新绑定当前VAO和程序,还是在谈论构建与旧对象状态相同的新对象?我的意思是,我将使用glUseProgram和保存的程序,然后重新绑定VAO和vbo。您是否在考虑在程序上创建类似于推/弹出状态的东西?因此,您模块的用户将能够推送当前状态,该状态将保存程序上的所有当前设置/调用,然后用户可以修改调用,执行一些额外的工作,并调用pop将所有内容恢复到以前的状态?您可以通过创建一个更高级别的工具来实现这一点,用户只需调用您的方法,您就可以保存这些值。但这对于一些情况来说是危险的,比如用户从CPU内存中设置指向顶点数据的指针,或者更糟糕的是设置堆栈…基本上我想问的是这个问题,但在我的情况下,我想知道制服和属性值是否都保留。我可以看到制服仍然存在,但是属性呢?“现在,如果我恢复程序和vbo,使用vao,这是否意味着完整的状态被恢复,客户端可以继续进行绘制调用。”你说的“恢复”是什么意思?在哪里恢复?您是在谈论重新绑定当前VAO和程序,还是在谈论构建与旧对象状态相同的新对象?我的意思是,我将使用glUseProgram和保存的程序,然后重新绑定VAO和vbo。您是否在考虑在程序上创建类似于推/弹出状态的东西?因此,您模块的用户将能够推送当前状态,该状态将保存程序上的所有当前设置/调用,然后用户可以修改调用,执行一些额外的工作,并调用pop将所有内容恢复到以前的状态?您可以通过创建一个更高级别的工具来实现这一点,用户只需调用您的方法,您就可以保存这些值。但这对于一些情况来说是危险的,比如用户从CPU内存中设置指向顶点数据的指针,或者更糟糕的是设置堆栈…基本上我想问的是这个问题,但在我的情况下,我想知道制服和属性值是否都保留。我可以看到制服仍然存在,但是属性呢?所以如果我不使用vao,我必须保存所有顶点属性位置的状态。1.我是否必须更改所有位置的保存信息,还是仅在更改后更改。假设允许128个属性位置,但我只更改了3个,我将只保存3个或所有128个2的信息。我必须存储的信息是数组位置、大小、步幅、类型、标准化标志。此外,我还必须看看我是使用vbo实现这一点,还是直接从cpu提供顶点数组指针。我必须保存任何其他内容,所以如果我不使用vao,我必须保存所有顶点属性位置的状态。1.我是否必须更改所有位置的保存信息,还是仅在更改后更改。假设允许128个属性位置,但我只更改了3个,我将只保存3个或所有128个2的信息。这个