78 lines
3.9 KiB
Markdown
78 lines
3.9 KiB
Markdown
# OpenGL
|
||
|
||
**命名空间**: `XCEngine::RHI`
|
||
|
||
**类型**: `submodule`
|
||
|
||
**描述**: XCEngine 的 OpenGL 后端入口,负责在 Win32/WGL 上建立上下文,并把抽象 RHI 设备、命令、资源和绑定模型适配为有状态的 OpenGL 调用序列。
|
||
|
||
## 概览
|
||
|
||
与 D3D12、Vulkan 这种“先记录、再提交”的显式后端不同,当前 `OpenGL` 子模块的核心特点是:
|
||
|
||
- 它依赖一个活动的 OpenGL 上下文
|
||
- 很多“命令列表”接口实际会立即对当前上下文生效
|
||
- descriptor set、pipeline layout、pipeline state 等抽象概念,在这里大多是适配层,而不是 OpenGL 原生对象
|
||
|
||
如果你熟悉 Unity,可以把它理解成“老牌状态机图形 API 的一层引擎化封装”:重点不在提交队列,而在把状态切换、纹理单元、uniform buffer 绑定和 framebuffer 组合管理好。
|
||
|
||
## 设计要点
|
||
|
||
- 设备层负责 WGL 上下文与能力探测。
|
||
- `OpenGLCommandQueue` 更像兼容抽象层的门面,而不是一条真实的 GPU 提交队列。
|
||
- `OpenGLCommandList` 更接近“状态与调用包装器”,不是可延迟提交的录制命令缓冲。
|
||
- `OpenGLPipelineState` 是 CPU 侧状态容器,`Bind()` 时把状态应用到当前上下文。
|
||
- `OpenGLDescriptorSet` 是对纹理单元、sampler 绑定点和 uniform buffer 绑定点的统一封装。
|
||
|
||
## 当前实现边界
|
||
|
||
- 平台路径是 Windows + WGL。
|
||
- 设备初始化支持隐藏窗口自建上下文,也支持附着到现有窗口。
|
||
- 命令队列和命令列表抽象已经能打通统一 RHI 路径,但不少接口仍然是适配性质的轻包装。
|
||
- 部分能力字段或设备信息字段带有“近似值”或“哨兵值”性质,不能把它们当作驱动级精确信息。
|
||
|
||
## 推荐阅读顺序
|
||
|
||
1. [OpenGLDevice](OpenGLDevice/OpenGLDevice.md)
|
||
2. [OpenGLCommandList](OpenGLCommandList/OpenGLCommandList.md)
|
||
3. [OpenGLPipelineState](OpenGLPipelineState/OpenGLPipelineState.md)
|
||
4. [OpenGLShader](OpenGLShader/OpenGLShader.md)
|
||
5. [OpenGLDescriptorSet](OpenGLDescriptorSet/OpenGLDescriptorSet.md)
|
||
|
||
## 与测试的对应关系
|
||
|
||
- `tests/RHI/OpenGL/unit/` 用于覆盖 OpenGL 后端专项行为。
|
||
- `tests/RHI/unit/test_shader.cpp`、`tests/RHI/unit/test_pipeline_layout.cpp` 会通过统一抽象验证 OpenGL 路径。
|
||
- `tests/RHI/OpenGL/integration/` 与 `tests/Rendering/integration/*` 覆盖真实绘制和截图结果。
|
||
|
||
## 头文件索引
|
||
|
||
- [OpenGLBuffer](OpenGLBuffer/OpenGLBuffer.md)
|
||
- [OpenGLCommandList](OpenGLCommandList/OpenGLCommandList.md)
|
||
- [OpenGLCommandQueue](OpenGLCommandQueue/OpenGLCommandQueue.md)
|
||
- [OpenGLDepthStencilView](OpenGLDepthStencilView/OpenGLDepthStencilView.md)
|
||
- [OpenGLDescriptorPool](OpenGLDescriptorPool/OpenGLDescriptorPool.md)
|
||
- [OpenGLDescriptorSet](OpenGLDescriptorSet/OpenGLDescriptorSet.md)
|
||
- [OpenGLDevice](OpenGLDevice/OpenGLDevice.md)
|
||
- [OpenGLEnums](OpenGLEnums/OpenGLEnums.md)
|
||
- [OpenGLFence](OpenGLFence/OpenGLFence.md)
|
||
- [OpenGLFramebuffer](OpenGLFramebuffer/OpenGLFramebuffer.md)
|
||
- [OpenGLPipelineLayout](OpenGLPipelineLayout/OpenGLPipelineLayout.md)
|
||
- [OpenGLPipelineState](OpenGLPipelineState/OpenGLPipelineState.md)
|
||
- [OpenGLRenderPass](OpenGLRenderPass/OpenGLRenderPass.md)
|
||
- [OpenGLRenderTargetView](OpenGLRenderTargetView/OpenGLRenderTargetView.md)
|
||
- [OpenGLResourceView](OpenGLResourceView/OpenGLResourceView.md)
|
||
- [OpenGLSampler](OpenGLSampler/OpenGLSampler.md)
|
||
- [OpenGLScreenshot](OpenGLScreenshot/OpenGLScreenshot.md)
|
||
- [OpenGLShader](OpenGLShader/OpenGLShader.md)
|
||
- [OpenGLSwapChain](OpenGLSwapChain/OpenGLSwapChain.md)
|
||
- [OpenGLTexture](OpenGLTexture/OpenGLTexture.md)
|
||
- [OpenGLTextureUnitAllocator](OpenGLTextureUnitAllocator/OpenGLTextureUnitAllocator.md)
|
||
- [OpenGLUniformBufferManager](OpenGLUniformBufferManager/OpenGLUniformBufferManager.md)
|
||
- [OpenGLVertexArray](OpenGLVertexArray/OpenGLVertexArray.md)
|
||
|
||
## 相关文档
|
||
|
||
- [RHI](../RHI.md)
|
||
- [Devices, Queues, Command Lists, And Resource Creation](../../../_guides/RHI/Devices-Queues-CommandLists-And-Resource-Creation.md)
|