3.4 KiB
3.4 KiB
OpenGLSwapChain
命名空间: XCEngine::RHI
类型: class
头文件: XCEngine/RHI/OpenGL/OpenGLSwapChain.h
描述: Win32 OpenGL 后端的交换链包装器;它把默认窗口帧缓冲与一个可选的 back buffer 代理纹理统一到 RHISwapChain 抽象下。
概览
在 D3D12 或 Vulkan 里,swap chain 往往意味着“由驱动管理的多张呈现图像”。当前 OpenGLSwapChain 不是这种模型。
它的真实工作方式更接近:
- 窗口系统拥有默认帧缓冲
- 引擎另外维护一张
OpenGLTexture作为GetCurrentBackBuffer()的返回对象 - Present 视情况把这张纹理 blit 到默认帧缓冲
- 最后调用 Win32
SwapBuffers
这种设计的重点不是模拟一份完整的显式 API 交换链,而是让上层渲染框架、测试基架和截图工具继续通过统一的 RHISwapChain 接口工作。
主要职责
- 记录
OpenGLDevice*、HWND和当前逻辑尺寸 - 按需创建一张
RGBA8的 back buffer 代理纹理 - 对外暴露 GetCurrentBackBuffer 与 GetCurrentBackBufferIndex
- 在 Present 中把代理纹理复制到默认帧缓冲
- 通过 SwapBuffers 调用系统呈现
当前实现的真实行为
- 只覆盖 Win32 路径,
GetNativeHandle()返回HWND PresentMode/SurfaceFormat两个枚举当前只停留在头文件层面,没有参与实际创建流程- GetCurrentBackBufferIndex 永远返回
0 - Resize 只更新缓存宽高,不重建
m_backBufferTexture - Present 忽略
syncInterval与flags - 当
m_backBufferTexture不满足当前约定条件时,Present()只会直接交换默认窗口缓冲 - Shutdown 释放代理纹理并断开设备/窗口引用,但不会把宽高清零
设计背景
OpenGL 的默认窗口帧缓冲由上下文和窗口系统维护,不能像显式 API 那样把每一张 back buffer 都作为标准资源对象稳定暴露。当前实现采用“代理纹理 + Present 时复制”的策略,主要收益有两点:
- 上层系统仍然可以把 back buffer 当作
RHITexture使用 - 资源视图、截图、离屏渲染等路径可以复用统一的纹理与视图抽象
这是一种很典型的跨后端工程折中:先保证 API 统一和可用性,再逐步增强平台特性。
生命周期
- OpenGLSwapChain() 把成员初始化为空状态
- Initialize 缓存设备/窗口并创建代理纹理
- 渲染期间通过 GetCurrentBackBuffer 暴露纹理给 RTV、截图和测试流程
- Present 负责把代理纹理内容提交到默认窗口帧缓冲
- Shutdown 释放代理纹理
当前限制
- 不是实际多缓冲 swap chain
- 不提供轮换帧索引
- 不支持真正的 vsync / mailbox / fifo 策略切换
Resize()与内部纹理尺寸可能失配- 缺少严格的错误处理和状态校验