1.6 KiB
1.6 KiB
OpenGLSwapChain::Present()
void Present(uint32_t syncInterval = 1, uint32_t flags = 0) override;
作用
把当前可呈现内容提交到窗口系统。
参数
syncInterval: 保留给统一接口;当前未使用flags: 保留给统一接口;当前未使用
当前实现行为
- 先忽略
syncInterval和flags - 如果
m_device非空,先调用m_device->MakeContextCurrent() - 然后检查是否满足“从代理纹理 blit 到默认帧缓冲”的条件:
m_backBufferTexture != nullptrm_backBufferTexture->GetID() != 0m_backBufferTexture->GetState() != ResourceStates::Common
- 如果满足条件:
- 创建临时
GL_READ_FRAMEBUFFER - 把代理纹理挂到
GL_COLOR_ATTACHMENT0 - 设置
glReadBuffer(GL_COLOR_ATTACHMENT0) - 把绘制目标切回默认帧缓冲
0 - 调用
glBlitFramebuffer(...)复制颜色内容 - 删除临时 FBO
- 创建临时
- 无论是否走 blit 路径,最后都会调用 Win32
::SwapBuffers(m_device->GetPresentationDC())
设计说明
这里的关键点是:当前 OpenGL 后端允许上层先渲染到一张普通纹理,再在 Present 阶段把纹理内容搬回默认窗口帧缓冲。这种结构更容易和跨后端 RHITexture / RHIResourceView 抽象保持一致。
注意事项
- 当前没有真正实现垂直同步控制
MakeContextCurrent()的返回值没有被检查- 如果代理纹理仍处于
ResourceStates::Common,实现会跳过 blit,直接交换默认窗口缓冲