簡體   English   中英

OpenGL:是否支持在一個上下文中渲染為FBO,然后在另一個上下文中使用FBO的紋理?

[英]OpenGL: Is it supported to render into an FBO in one context, then use the FBO's texture in another?

我具有以下OpenGL設置,用於解決幀緩沖區問題:

  1. 我將多維數據集渲染到幀緩沖區中。
  2. 我使用該幀緩沖區中的目標紋理繪制一個紋理四邊形,該四邊形在我的視口中顯示該多維數據集。

當過程的兩個階段都在同一上下文中完成時,此方法可以正常工作,但是如果階段1在與第二階段不同的上下文中完成,則會中斷(請注意,這些上下文都是共享的,並且都在同一線程上)。 在這種情況下,我只能在調整視口大小(重新創建幀緩沖區)時看到顯示的多維數據集。 多維數據集有時會損壞或碎片化,這使我相信,我所看到的只是紋理調整大小之前紋理所使用的內存部分,並且從未正確顯示任何內容。

我必須進行此設置的原因是,在我的實際應用程序中,我使用的是Qt OpenGL小部件,這些部件必須使用各自的上下文,因此必須在自己的專用上下文中渲染場景,然后將其復制到使用可共享OpenGL資源的相關視口。 如果我不這樣做,我會收到由於VAO在其他情況下綁定/使用而導致的錯誤。

我嘗試了以下不成功的組合(主要上下文是我使用紋理繪制四邊形的位置,而次要上下文是將多維數據集“脫離屏幕”渲染到幀緩沖區中的位置):

  • 在輔助上下文中創建幀緩沖區,其渲染緩沖區及其紋理。
  • 在輔助上下文中創建幀緩沖區和渲染緩沖區,在主上下文中創建紋理,然后在輔助上下文中將紋理附加到幀緩沖區。
  • 在輔助上下文中創建幀緩沖區,其渲染緩沖區和兩個單獨的紋理。 這些紋理之一最初附加到幀緩沖區以進行渲染。 渲染到幀緩沖區后,將分離第一個紋理,並附加第二個紋理。 先前包含的包含渲染內容的紋理在主要上下文中與四邊形一起使用。

另外,由於無法訪問QOpenGLWidget在應用程序中使用的幀緩沖區,因此我無法使用glBlitFramebuffer() (據我所嘗試, QOpenGLWidget::defaultFramebufferObject()返回0導致glBlitFramebuffer給出我的錯誤)。

我設法使渲染正常工作的唯一方法是使用QOpenGLFrameBuffer並在要與四邊形一起使用紋理時調用takeTexture() 但是,以這種方式進行操作意味着QOpenGLFrameBuffer會自己創建一個新紋理,使用后我必須銷毀舊紋理,這似乎效率很低。

有什么我可以解決的問題嗎?

我有一個使用這種紋理的項目。 在繪制之后和使用QOpenGLFramebufferObject::texture()的紋理之前,需要調用glFinish() QOpenGLFramebufferObject::texture() 這是某些操作系統上的問題。

暫無
暫無

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

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