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
Qt 取消分配QGLWidget创建的OpenGL上下文_Qt_Opengl_Qglwidget_Openglcontext - Fatal编程技术网

Qt 取消分配QGLWidget创建的OpenGL上下文

Qt 取消分配QGLWidget创建的OpenGL上下文,qt,opengl,qglwidget,openglcontext,Qt,Opengl,Qglwidget,Openglcontext,如果我创建了一个QGLWidget,然后我使用像glGenTextures、glTex2DImage之类的东西来分配我自己的纹理,那么当我删除这个小部件时,所有的纹理数据都会被清除吗?(此外,我还将拥有共享小部件,这些小部件也将被删除) 我查看了析构函数的源代码,它看起来像是在删除上下文,我假设它也会清理我使用该上下文生成的任何纹理 只是想确保万一我丢失了一些东西否,只有当使用纹理存储的对象未绑定到共享它的任何上下文中时,才会释放纹理存储。此外,它不会仅仅因为1个上下文被破坏而被隐式释放。您在

如果我创建了一个QGLWidget,然后我使用像glGenTextures、glTex2DImage之类的东西来分配我自己的纹理,那么当我删除这个小部件时,所有的纹理数据都会被清除吗?(此外,我还将拥有共享小部件,这些小部件也将被删除)

我查看了析构函数的源代码,它看起来像是在删除上下文,我假设它也会清理我使用该上下文生成的任何纹理


只是想确保万一我丢失了一些东西

否,只有当使用纹理存储的对象未绑定到共享它的任何上下文中时,才会释放纹理存储。此外,它不会仅仅因为1个上下文被破坏而被隐式释放。您在所有共享上下文之间共享相同的对象名称空间,因此不允许发生这种情况(共享组中的所有上下文都必须销毁)

每个上下文都维护其自己的绑定纹理集,因此如果在上下文AB中绑定纹理1,则删除上下文A在同时删除(或解除绑定)上下文B之前,无法释放纹理。此行为也适用于调用
glDeleteTextures(…)

该函数将从当前(调用)上下文隐式解除绑定您传递的纹理,但在任何其他上下文中解除绑定之前,不允许释放内存。唯一会立即发生的事情是纹理名称可以立即重用,并且可以通过后续调用
glGenTextures(…)
返回


长话短说,在您的情况下,内存最终将被释放(您声称将销毁所有上下文)。当您销毁第一个上下文时,它不一定会立即被释放-必须首先满足上述其他条件。

我决定继续使用glDeleteTextures。我非常确定我只使用了1个上下文,因为我有1个QGLWidget和10个share Widget。所以希望只调用一次glDeleteTextures就可以了。共享小部件只意味着属于您创建的小部件的上下文与其他小部件的上下文共享资源。与正常行为相反,每个小部件的上下文是完全独立的。