[英]How do I force OpenGL to clear an object for buffer processing with a QOpenGLWidget?
我開發了一個GUI工具(使用PyQt5),該工具將OpenGL圖形(使用ModernGL )與神經網絡集成在一起,以探索在呈現某些對象姿勢時神經網絡如何失敗。 完整的源代碼在這里 。 對於“檢測器”和“映射器”模式,當用戶通過按下一個鍵查詢神經網絡時,該神經網絡預測將呈現在對象的頂部,例如:
重要的是,我試圖進行設置,以便如果用戶第二次查詢神經網絡而未進行任何更改,則該工具會先清除舊的預測,然后再生成要渲染的新預測。 這是這段代碼:
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()
行, model.clear()
得到如下序列:
因為神經網絡正在使用以熱圖作為輸入的場景,所以每個查詢的熱圖都會發生變化。 但是,該工具還具有“實時”模式, get_prediction
調用get_prediction
都會調用paintGL
,即使未對model.clear()
行進行注釋,渲染器model.clear()
顯示第二種行為,即熱圖在不斷變化而不是保持靜態。 如您在上面的代碼中看到的,我嘗試做的一件事是在對model.clear()
的調用之后的上下文中調用finish
,這應該是“ 等待所有繪制命令完成 ”(例如glFinish
),但是沒用。 我還嘗試通過以下方式設置QSurfaceFormat
交換行為:
fmt.setSwapBehavior(QSurfaceFormat.SingleBuffer)
但這也不起作用。 任何提示將非常感謝!
當它不在實時模式下時似乎可以正常工作的事實是,這使我誤入歧途。 該修補程序顯然是確保我以正確的順序正確清除和渲染內容的一種方法。 可以在這里找到提交。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.