Files
XCEngine/docs/api/XCEngine/RHI/OpenGL/OpenGLSwapChain/Present.md

1.6 KiB
Raw Blame History

OpenGLSwapChain::Present()

void Present(uint32_t syncInterval = 1, uint32_t flags = 0) override;

作用

把当前可呈现内容提交到窗口系统。

参数

  • syncInterval: 保留给统一接口;当前未使用
  • flags: 保留给统一接口;当前未使用

当前实现行为

  • 先忽略 syncIntervalflags
  • 如果 m_device 非空,先调用 m_device->MakeContextCurrent()
  • 然后检查是否满足“从代理纹理 blit 到默认帧缓冲”的条件:
    • m_backBufferTexture != nullptr
    • m_backBufferTexture->GetID() != 0
    • m_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直接交换默认窗口缓冲

相关文档