OpenGL实现OIT时不同窗口资源能否共用绑定点及多窗口渲染异常咨询
OpenGL多窗口场景下PPLL透明渲染异常问题
问题背景
已实现PPLL(Per-Pixel Linked Lists,逐像素链表)完成透明渲染,单场景运行状态正常,问题出现在多窗口场景下使用PPLL时。
项目基于OpenGL 4.5 + QT开发,UI架构如下:
界面分为窗口0和窗口1两部分,二者从不同视角渲染相同内容,另有窗口2会按需开闭展示其他内容。三个窗口原本都可正常进行透明模式渲染,但关闭窗口2后,窗口0会出现闪烁、失色异常(窗口1状态仍正常),异常效果如下:
实现细节
三个窗口共用同一套着色器,PPLL片段着色器中的image在每个窗口渲染时都使用相同的绑定点:
layout (binding = 0, r32ui) uniform uimage2D head_pointer_image; // 存储所有像素的头指针 layout (binding = 1, rgba32ui) uniform writeonly uimageBuffer list_buffer; // 存储每个片元数据 layout (binding = 0, offset = 0) uniform atomic_uint list_counter; // 为每个片元分配唯一索引
每个窗口都持有独立的PPLL资源(缓冲区、纹理),资源在窗口初始化时申请,窗口关闭时销毁:
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);
已验证猜想
针对窗口0的渲染异常,已测试两种猜想均未得到符合预期的结果:
- 不同窗口的GLSL中定义的image应当使用不同的绑定点
- 不同窗口应当共用PPLL的缓冲区、纹理资源
问题更新
项目复杂度较高,暂不能完全确定异常和PPLL相关。当窗口0和1同时绘制对象A和B时会触发异常,但若两个窗口仅绘制对象A或仅绘制对象B时无异常,现象十分特殊,目前暂无明确排查思路。
内容的提问来源于stack exchange,提问作者Ray
相关产品推荐
相关产品推荐

