如何强制OpenGL清除了QOpenGLWidget用于缓冲处理的对象?

问题描述 投票:2回答:1

我公司开发的GUI工具(使用PyQt5)是OpenGL图形(使用ModernGL)与神经网络集成,探索带有特定对象时造成网络如何神经失败。完整的源代码可以here。对于“检测器”和“映射器”模式中,当用户查询通过按一个键的神经网络,该神经网络预测被渲染的物体时,e.g的顶部.:

No class activation map. With class activation map.

重要的是,我试图将其设置这样,如果用户查询神经网络第二次不改变任何东西,该工具首先生成一个新的预测来呈现之前清除旧的预测。下面是代码位:

def get_prediction(self):

    self.model.clear()
    # self.scene.CTX.finish()

    buffer = QtCore.QBuffer()
    buffer.open(QtCore.QIODevice.ReadWrite)
    qimage = self.grabFramebuffer()
    qimage.save(buffer, "PNG")

    strio = io.BytesIO()
    strio.write(buffer.data())
    buffer.close()
    strio.seek(0)
    pil_im = Image.open(strio)
    pil_im = pil_im.resize(self.scene.WINDOW_SIZE)

    self.model.predict(pil_im)

model.clear()释放预测的纹理,顶点数组,和顶点缓冲器。这似乎工作,如果我键多次查询,呈现的图像保持不变(即神经网络只使用场景生成热图,不与热图中的场景)。如果我注释掉model.clear()线,我得到的东西像下面的顺序:

enter image description here enter image description here

其中热图,因为神经网络使用场景与热图作为输入上每个查询变化。不过,这个工具也有一个“活”的模式,其中get_prediction每天paintGL被调用时调用,甚至与model.clear()行注释掉,渲染器呈现在热图是不断变化的,而不是保持静止的第二行为。正如你可以在上面的代码中看到,有一件事我试图为调用finish上下文调用model.clear(),这是为了“Wait for all drawing commands to finish,”(如glFinish),但没有奏效以下。我也试图与设置QSurfaceFormat交换行为:

fmt.setSwapBehavior(QSurfaceFormat.SingleBuffer)

但也没有工作。任何提示将非常感谢!

qt opengl pyqt qt5 pyqt5
1个回答
0
投票

它似乎在工作时没有在现场模式是送我错了路红鲱鱼的事实。此修复程序是确保我在正确清除并以正确的顺序绘制的东西明显的一个。该承诺可以发现here

© www.soinside.com 2019 - 2024. All rights reserved.