未绑定着色器时,制服集和顶点属性值是不是保留
Posted
技术标签:
【中文标题】未绑定着色器时,制服集和顶点属性值是不是保留【英文标题】:Does uniforms set and vertex attributes values remain when shader is unbound未绑定着色器时,制服集和顶点属性值是否保留 【发布时间】:2016-02-11 07:16:00 【问题描述】:我想知道如果着色器程序未绑定然后反弹,uniform和vertex属性变量值是否仍然存在
基本上我想问这个问题Do uniform values remain in GLSL shader if unbound?。但我想知道这是否适用于制服和属性变量?
如果我这样做
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();
这是否意味着完整状态已恢复并且绘图调用将起作用。我认为如果保留制服和属性值,这应该可行。所以当我用glUseProgram恢复客户端程序时,客户端设置的所有制服和属性都会被恢复。
如果没有,那么我该如何保存完整状态。一件事是客户必须再次设置它们。但如果这不是一个选择,还有什么别的办法。如何保存完整状态并在以后恢复。甚至可能吗?
PS:我需要为 opengl 2.0、opengl 3.2+、opengl es 2.0、opengles 3.0 执行此操作
【问题讨论】:
"现在,如果我恢复程序和正在使用的 vbo, vao,这是否意味着恢复了完整状态并且客户端可以继续进行绘图调用。" 做什么你的意思是“恢复它”?在哪里恢复?您是在谈论重新绑定当前的 VAO 和程序,还是在谈论构建与旧对象具有相同状态的新对象? 我的意思是我将使用 glUseProgram 和保存的程序,然后重新绑定 vao 和 vbo。 您是否正在考虑在程序上创建类似推送/弹出状态的东西?因此,您的模块的用户将能够推送当前状态,这将保存程序上的所有当前设置/调用,然后用户可以修改调用,做一些额外的工作并调用 pop 将所有内容恢复到以前的状态?您可以通过创建更高级别的工具来做到这一点,用户只会调用您的方法并且您可以保存这些值。对于诸如用户从 CPU 内存中设置指向顶点数据的指针或更糟糕的堆栈等情况,这仍然是危险的...... 基本上我想问的是这个问题***.com/questions/10857602/… 但就我而言,我想知道制服和属性值是否仍然存在。我可以看到制服仍然存在,但是属性呢? 【参考方案1】:制服
制服是着色器程序对象的一部分。因此,即使程序对象未绑定,它们也会保持保存。 OpenGL 4.5 Specification 对此表示:
7.6 统一变量
默认uniform块中的uniform,除了子程序uniform,是 程序对象特定的状态。一旦加载,它们就会保留它们的值,并且它们的值 每当使用程序对象时,只要程序对象具有 没有被重新链接。
属性
属性绑定是 VAO 状态的一部分。如果没有绑定 VAO,则使用默认 VAO(顺便说一句,Core Profile 中不允许这样做)。使用 VAO 时,恢复属性绑定非常简单,因为重新绑定 VAO 就足够了。在另一种情况下,我会查看“关联获取”部分here。
【讨论】:
所以如果我不使用 vao,我将不得不保存所有顶点属性位置的状态状态。 1. 我必须更改所有位置的保存信息还是只更改一次。假设允许有 128 个属性位置,但我只更改 3 个,我将只保存 3 个或所有 128 个 2 的信息。我必须存储的信息是启用数组位置、大小、步幅、类型、规范化标志。此外,我将不得不查看我是为此使用 vbo 还是直接从 cpu 提供顶点数组指针。我还有什么需要保存的以上是关于未绑定着色器时,制服集和顶点属性值是不是保留的主要内容,如果未能解决你的问题,请参考以下文章