簡體   English   中英

OpenGL幀緩沖功能無法在單獨的類中完全運行

[英]OpenGL frame-buffer functions not fully working in separate class

我的問題:

當嘗試在處理渲染循環的主要類之外的單獨類中執行幀緩沖區操作時,將執行代碼並注冊一些函數,但最終操作結果不會呈現。

絕對清楚,如果我從單獨的類(GBuffer)中復制預期的渲染操作,然后將其合並到主渲染類中,則一切正常。

如果碰巧是一個錯誤的問題,那么另一個問題是“如何在QOpenGLWidget類之外執行渲染操作?”

細節:

渲染循環中 ,我可以執行以下操作並將場景渲染到屏幕上:

glBindFramebuffer(GL_DRAW_FRAMEBUFFER, TARGET_FBO);
glDrawBuffer(GL_COLOR_ATTACHMENT4);
glClear(GL_COLOR_BUFFER_BIT);

RenderPass();

glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBindFramebuffer(GL_READ_FRAMEBUFFER, TARGET_FBO);
glReadBuffer(GL_COLOR_ATTACHMENT4);
glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_LINEAR);

但是,如果我將渲染傳遞之前和之后的行移動到單獨的類(例如GBuffer)中 ,則代碼將運行,但不會渲染任何東西:

GBuffer.StartFrame();

RenderPass();

GBuffer.FinalPass();
glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_LINEAR);

我的渲染類擴展了我的名為DFuncShader的類,該類包含着色器程序並擴展了QOpenGLFunctions_4_3_Core。 我已經在其他幾個類中執行了此操作,但沒有發現任何問題,但是之前它們都沒有對幀緩沖區做任何事情,它們主要只是處理着色器操作。

唯一的區別是我的Rendering類也繼承自QOpenGLWidget。

我能想到的唯一解決方案是在GBuffer類中添加一個指向主渲染類的指針,並使用該指針附加所有OpenGL調用,這幾乎使該類無濟於事...

您所描述的重構不會影響結果,因為OpenGL只是C API,並且不關心在其之上進行的任何C ++包裝,只要函數順序相同且參數相同即可。 您確定兩個版本的TARGET_FBO相同嗎? 您可以使用兩個版本的Apitrace捕獲跟蹤並進行比較。 我懷疑會有一些差異可以解釋失敗的原因。

從提供的“ QOpenGLWidget”類外部使用時,我縮小了哪些功能無法使用,而且似乎只要將默認的幀緩沖區綁定到主QOpenGLWidget類中,一切就可以了。

那一行

glBindFramebuffer(GL_FRAMEBUFFER,defaultFramebufferObject());

或使用“ 0”之類的任何變體顯然都不能在我的任何其他類中發生,除了一個處理我的渲染循環的類。

這很容易處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM