簡體   English   中英

在實現OIT的同時,不同windows的buffer和texture能否在OpenGL中共享同一個綁定點?

[英]Could the buffers and textures of different windows share the same binding point in OpenGL while realizing OIT?

首先我想說我已經實現了PPLL(Per-Pixel Linked Lists) 可以透明地繪制,一切看起來都很正常。 問題發生在我嘗試在多個 windows 中使用 PPLL 的時候。

我在我的程序中使用 OpenGL 4.5 + QT。 用戶界面草圖如下所示: 在此處輸入圖像描述

界面分為window 0和1兩部分,它們從不同的角度渲染相同的東西。 window 2 偶爾會打開和關閉以顯示其他內容。

windows這三個都可以正常在透明模式下渲染。 但是,當一個 window 2 關閉時,window 0 會變成閃爍無色(而 window 2 仍然正常),如下圖所示。

在此處輸入圖像描述

以下是每個 window 中 PPLL 的一些實現細節。

三個 windows 使用相同的着色器。 值得注意的是,PPLL 的片段着色器中的圖像對於每個 window 共享相同的綁定點。

layout (binding = 0, r32ui)         uniform uimage2D head_pointer_image;        // save the head pointers for all pixels
layout (binding = 1, rgba32ui)      uniform writeonly uimageBuffer list_buffer; // save every fragment data
layout (binding = 0, offset = 0)    uniform atomic_uint list_counter;           // used to assign a unique index for each fragment

每個 window 都有自己的 PPLL 資源(緩沖區和紋理),這些資源將在 window 初始化時應用,在 window 關閉時刪除。

GLuint m_headPointerTexture;
GLuint m_headPointerClearBuffer;
GLuint m_atomicCounterBuffer;
GLuint m_linkedListBuffer;
GLuint m_linkedListTexture;
....
glDeleteTextures(1, &m_headPointerTexture);
glDeleteBuffers(1, &m_headPointerClearBuffer);
glDeleteBuffers(1, &m_atomicCounterBuffer);
glDeleteBuffers(1, &m_linkedListBuffer);
glDeleteTextures(1, &m_linkedListTexture);

對於 window 0 的錯誤渲染,我有兩個猜想:

  1. 不同的 windows 應該對 glsl 中定義的圖像使用不同的綁定點。

  2. 不同的 windows 應該共享資源(緩沖區和紋理)。

我對每個猜想都進行了各種測試,但結果都不盡如人意。

更新:

這是一個復雜的項目。 我不完全確定該錯誤與 PPLL 有關。 當object A和B都畫在window 0和1上時,會出現錯誤。 但是,當我只在window 0和1上繪制object A(或B)時,不會出現錯誤。 這很奇怪。 我完全瘋了。

該錯誤發生在window 2 關閉時,與window 2 申請的資源釋放有關。

適當調整 window 2 的解構順序即可解決問題。

暫無
暫無

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

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