refactor(docs): RHI模块文档重构 - 修复18处链接错误并新增RHIFramebuffer/RHIRenderPass文档

- 修复opengl/下13个文件对overview.md的错误引用,改为opengl.md
- 修复opengl/shader/下2处get-native-handle.md的错误路径引用
- 修复rhi.md中rhifactory路径错误
- 修复opengl.md中对d3d12.md的错误引用
- 修复opengl/README.md中的overview.md引用
- 新增RHIFramebuffer完整文档(7个文件)
- 新增RHIRenderPass完整文档(7个文件)
- 更新rhi.md总览页,添加RHIFramebuffer和RHIRenderPass分类
This commit is contained in:
2026-03-26 01:29:00 +08:00
parent 0651666d8c
commit 1cf744b755
33 changed files with 478 additions and 29 deletions

View File

@@ -64,12 +64,12 @@ fence.Shutdown();
## 相关文档
- [Initialize](methods/initialize.md)
- [Shutdown](methods/shutdown.md)
- [Signal](methods/signal.md)
- [Wait](methods/wait.md)
- [GetCompletedValue](methods/get-completed-value.md)
- [IsSignaled](methods/is-signaled.md)
- [GetEventHandle](methods/get-event-handle.md)
- [GetNativeHandle](methods/get-native-handle.md)
- [GetFence](methods/get-fence.md)
- [Initialize](../../../threading/task-system/initialize.md)
- [Shutdown](../../../threading/task-system/shutdown.md)
- [Signal](../../command-queue/signal.md)
- [Wait](../../../threading/task-group/wait.md)
- [GetCompletedValue](../../command-queue/get-completed-value.md)
- [IsSignaled](../../fence/is-signaled.md)
- [GetEventHandle](get-event-handle.md)
- [GetNativeHandle](../../buffer/get-native-handle.md)
- [GetFence](get-fence.md)

View File

@@ -39,4 +39,4 @@ O(n) - 取决于资源释放时间
## 相关文档
- [D3D12Texture](texture.md) - 类总览
- [Shutdown](../../../texture/shutdown.md) - 关闭纹理
- [Shutdown](../../../threading/task-system/shutdown.md) - 关闭纹理

View File

@@ -0,0 +1,54 @@
# RHIFramebuffer
**命名空间**: `XCEngine::RHI`
**类型**: `class (abstract)`
**头文件**: `XCEngine/RHI/RHIFramebuffer.h`
**描述**: 帧缓冲抽象接口,封装渲染目标帧缓冲的创建和管理。
## 概述
`RHIFramebuffer` 是 RHI 抽象层的帧缓冲接口用于管理渲染目标Render Target的帧缓冲对象。它代表一个可用的帧缓冲结构包含颜色附件、深度附件和模板附件。不同图形 API 后端OpenGL、D3D12通过实现此接口提供各自的帧缓冲管理机制。
帧缓冲是渲染管线中的核心对象,用于:
- 存储渲染操作的颜色、深度、模板数据
- 作为纹理输入传递给后续渲染步骤
- 支持多重渲染目标MRT和延迟渲染
## 公共方法
| 方法 | 描述 |
|------|------|
| [`Initialize`](initialize.md) | 初始化帧缓冲 |
| [`Shutdown`](shutdown.md) | 关闭帧缓冲 |
| [`GetNativeHandle`](get-native-handle.md) | 获取原生句柄 |
| [`GetWidth`](get-width.md) | 获取帧缓冲宽度 |
| [`GetHeight`](get-height.md) | 获取帧缓冲高度 |
| [`IsValid`](is-valid.md) | 检查帧缓冲是否有效 |
## 使用示例
```cpp
#include <XCEngine/RHI/RHIFramebuffer.h>
#include <XCEngine/RHI/RHIRenderPass.h>
// 通过 RHIDevice 创建帧缓冲
RHIFramebuffer* framebuffer = device->CreateFramebuffer(
renderPass,
width, height,
colorAttachmentCount,
colorAttachments,
depthStencilAttachment
);
if (framebuffer && framebuffer->IsValid()) {
// 使用帧缓冲进行渲染
framebuffer->Shutdown();
}
```
## 相关文档
- [RHIRenderPass](../render-pass/render-pass.md) - 渲染通道接口

View File

@@ -0,0 +1,17 @@
# RHIFramebuffer::GetHeight
获取帧缓冲的高度。
```cpp
virtual uint32_t GetHeight() const = 0;
```
**返回:** `uint32_t` - 帧缓冲高度(像素)
**线程安全:**
**示例:**
```cpp
uint32_t height = framebuffer->GetHeight();
```

View File

@@ -0,0 +1,25 @@
# RHIFramebuffer::GetNativeHandle
获取帧缓冲的原生句柄。
```cpp
virtual void* GetNativeHandle() = 0;
```
返回底层图形 API 的帧缓冲句柄。不同后端返回不同类型:
- OpenGL: 返回 `GLuint`(帧缓冲对象 ID
- D3D12: 返回 `ID3D12Resource*` 指针
**返回:** `void*` - 原生句柄
**线程安全:**
**示例:**
```cpp
void* handle = framebuffer->GetNativeHandle();
#ifdef XCENGINE_OPENGL
GLuint fbo = static_cast<GLuint>(reinterpret_cast<intptr_t>(handle));
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
#endif
```

View File

@@ -0,0 +1,17 @@
# RHIFramebuffer::GetWidth
获取帧缓冲的宽度。
```cpp
virtual uint32_t GetWidth() const = 0;
```
**返回:** `uint32_t` - 帧缓冲宽度(像素)
**线程安全:**
**示例:**
```cpp
uint32_t width = framebuffer->GetWidth();
```

View File

@@ -0,0 +1,49 @@
# RHIFramebuffer::Initialize
初始化帧缓冲对象。
```cpp
virtual bool Initialize(
class RHIRenderPass* renderPass,
uint32_t width,
uint32_t height,
uint32_t colorAttachmentCount,
RHIResourceView** colorAttachments,
RHIResourceView* depthStencilAttachment
) = 0;
```
根据指定的渲染通道和附件配置,创建并初始化帧缓冲对象。
**参数:**
- `renderPass` - 关联的渲染通道对象
- `width` - 帧缓冲宽度(像素)
- `height` - 帧缓冲高度(像素)
- `colorAttachmentCount` - 颜色附件数量
- `colorAttachments` - 颜色附件资源视图数组
- `depthStencilAttachment` - 深度模板附件资源视图,可为 `nullptr`
**返回:** `bool` - 初始化成功返回 `true`,失败返回 `false`
**线程安全:**
**注意:**
- `width``height` 必须大于 0
- `colorAttachments` 数组长度必须与 `colorAttachmentCount` 匹配
- 所有附件的尺寸必须与指定的 `width``height` 一致
- 帧缓冲创建后,其尺寸不可更改,需调用 `Shutdown` 后重新初始化
**示例:**
```cpp
// 创建带有颜色和深度附件的帧缓冲
RHIResourceView* colorViews[1] = { colorRTView };
RHIResourceView* depthView = depthStencilView;
bool success = framebuffer->Initialize(
renderPass,
1920, 1080,
1, colorViews,
depthView
);
```

View File

@@ -0,0 +1,27 @@
# RHIFramebuffer::IsValid
检查帧缓冲是否有效。
```cpp
virtual bool IsValid() const = 0;
```
判断帧缓冲是否已正确初始化且可用于渲染操作。
**返回:** `bool` - 帧缓冲有效返回 `true`,无效返回 `false`
**线程安全:**
**注意:**
- 返回 `false` 可能原因:未初始化、初始化失败、已被 `Shutdown`
- 在调用 `Initialize` 前调用此方法会返回 `false`
**示例:**
```cpp
if (framebuffer->IsValid()) {
// 执行渲染操作
} else {
// 处理无效帧缓冲
}
```

View File

@@ -0,0 +1,21 @@
# RHIFramebuffer::Shutdown
关闭帧缓冲并释放相关资源。
```cpp
virtual void Shutdown() = 0;
```
销毁帧缓冲对象,释放底层图形 API 资源。调用后,帧缓冲不再有效,需要重新调用 `Initialize` 才能使用。
**线程安全:**
**注意:**
- 调用此方法后,帧缓冲对象仍可被安全地重复调用 `Shutdown`
- 确保在帧缓冲未被任何活跃渲染操作使用时调用
**示例:**
```cpp
framebuffer->Shutdown();
```

View File

@@ -22,5 +22,5 @@ OpenGL 后端已创建以下组件文件夹和文档:
## 相关文档
- [OpenGL 后端总览](overview.md)
- [RHI 抽象层](overview.md)
- [OpenGL 后端总览](opengl.md)
- [RHI 抽象层](opengl.md)

View File

@@ -34,5 +34,5 @@
## 相关文档
- [OpenGL 后端总览](../overview.md)
- [OpenGL 后端总览](../opengl.md)
- [RHIBuffer](../../buffer/buffer.md) - 抽象缓冲区接口

View File

@@ -111,5 +111,5 @@ delete cmdList;
## 相关文档
- [OpenGL 后端总览](../overview.md)
- [OpenGL 后端总览](../opengl.md)
- [RHICommandList](../../command-list/command-list.md) - 抽象命令列表接口

View File

@@ -26,5 +26,5 @@ OpenGL 采用立即模式Immediate Mode渲染与 D3D12 的命令列表
## 相关文档
- [OpenGL 后端总览](../overview.md)
- [OpenGL 后端总览](../opengl.md)
- [RHICommandQueue](../../command-queue/command-queue.md) - 抽象命令队列接口

View File

@@ -44,4 +44,4 @@
## 相关文档
- [OpenGL 后端总览](../overview.md)
- [OpenGL 后端总览](../opengl.md)

View File

@@ -102,5 +102,5 @@ if (device.InitializeWithExistingWindow(existingWindow)) {
## 相关文档
- [OpenGL 后端总览](../overview.md)
- [OpenGL 后端总览](../opengl.md)
- [RHIDevice](../../device/device.md) - 抽象设备接口

View File

@@ -70,5 +70,5 @@ fence.Reset();
## 相关文档
- [OpenGL 后端总览](../overview.md)
- [OpenGL 后端总览](../opengl.md)
- [RHIFence](../../fence/fence.md) - 抽象栅栏接口

View File

@@ -38,4 +38,4 @@
## 相关文档
- [RHI 模块总览](../rhi.md) - RHI 模块总览
- [D3D12 后端](overview.md)
- [D3D12 后端](../../d3d12/d3d12.md)

View File

@@ -37,5 +37,5 @@
## 相关文档
- [OpenGL 后端总览](../overview.md)
- [OpenGL 后端总览](../opengl.md)
- [RHIPipelineState](../../pipeline-state/pipeline-state.md) - 抽象管线状态接口

View File

@@ -85,4 +85,4 @@ void RenderToCubemap() {
## 相关文档
- [OpenGL 后端总览](../overview.md)
- [OpenGL 后端总览](../opengl.md)

View File

@@ -68,5 +68,5 @@ if (sampler.Initialize(desc)) {
## 相关文档
- [OpenGL 后端总览](../overview.md)
- [OpenGL 后端总览](../opengl.md)
- [RHISampler](../../sampler/sampler.md) - 抽象采样器接口

View File

@@ -20,4 +20,4 @@ glUseProgram(programId);
## 相关文档
- [OpenGLShader 总览](shader.md) - 返回类总览
- [GetNativeHandle](../../buffer/get-native-handle.md) - 原生句柄
- [GetNativeHandle](../../shader/get-native-handle.md) - 原生句柄

View File

@@ -47,11 +47,11 @@
|------|------|
| [`GetUniformLocation`](get-uniform-location.md) | 获取 uniform 位置 |
| [`GetID`](get-id.md) | 获取着色器 ID |
| [`GetNativeHandle`](../../buffer/get-native-handle.md) | 获取原生句柄 |
| [`GetNativeHandle`](../../shader/get-native-handle.md) | 获取原生句柄 |
| [`IsValid`](../../shader/is-valid.md) | 检查是否有效 |
| [`GetType`](../../shader/get-type.md) | 获取着色器类型 |
## 相关文档
- [OpenGL 后端总览](../overview.md)
- [OpenGL 后端总览](../opengl.md)
- [RHIShader](../../shader/shader.md) - 抽象着色器接口

View File

@@ -72,5 +72,5 @@ swapChain.Shutdown();
## 相关文档
- [OpenGL 后端总览](../overview.md)
- [OpenGL 后端总览](../opengl.md)
- [RHISwapChain](../../swap-chain/swap-chain.md) - 抽象交换链接口

View File

@@ -38,5 +38,5 @@
## 相关文档
- [OpenGL 后端总览](../overview.md)
- [OpenGL 后端总览](../opengl.md)
- [RHITexture](../../texture/texture.md) - 抽象纹理接口

View File

@@ -64,5 +64,5 @@ vao.Shutdown();
## 相关文档
- [OpenGL 后端总览](../overview.md)
- [OpenGL 后端总览](../opengl.md)
- [VertexAttribute 结构体](vertex-attribute.md)

View File

@@ -0,0 +1,17 @@
# RHIRenderPass::GetColorAttachmentCount
获取颜色附件的数量。
```cpp
virtual uint32_t GetColorAttachmentCount() const = 0;
```
**返回:** `uint32_t` - 颜色附件数量
**线程安全:**
**示例:**
```cpp
uint32_t count = renderPass->GetColorAttachmentCount();
```

View File

@@ -0,0 +1,27 @@
# RHIRenderPass::GetColorAttachments
获取颜色附件描述数组。
```cpp
virtual const AttachmentDesc* GetColorAttachments() const = 0;
```
返回渲染通道初始化时配置的颜色附件描述数组。数组长度可通过 `GetColorAttachmentCount()` 获取。
**返回:** `const AttachmentDesc*` - 颜色附件描述数组指针
**线程安全:**
**注意:**
- 返回的指针在渲染通道生命周期内有效
- 不要尝试修改返回的描述数据
**示例:**
```cpp
const AttachmentDesc* attachments = renderPass->GetColorAttachments();
for (uint32_t i = 0; i < renderPass->GetColorAttachmentCount(); ++i) {
Format format = attachments[i].format;
// 处理每个附件配置
}
```

View File

@@ -0,0 +1,27 @@
# RHIRenderPass::GetDepthStencilAttachment
获取深度模板附件描述。
```cpp
virtual const AttachmentDesc* GetDepthStencilAttachment() const = 0;
```
返回渲染通道初始化时配置的深度模板附件描述。如果渲染通道未配置深度模板附件,返回 `nullptr`
**返回:** `const AttachmentDesc*` - 深度模板附件描述指针,未配置时返回 `nullptr`
**线程安全:**
**注意:**
- 返回的指针在渲染通道生命周期内有效
- 不要尝试修改返回的描述数据
**示例:**
```cpp
const AttachmentDesc* depthStencil = renderPass->GetDepthStencilAttachment();
if (depthStencil != nullptr) {
Format format = depthStencil->format;
// 处理深度模板配置
}
```

View File

@@ -0,0 +1,23 @@
# RHIRenderPass::GetNativeHandle
获取渲染通道的原生句柄。
```cpp
virtual void* GetNativeHandle() = 0;
```
返回底层图形 API 的渲染通道句柄。
**返回:** `void*` - 原生句柄
**线程安全:**
**注意:**
- OpenGL 实现返回 `nullptr`OpenGL 使用 FBO 绑定状态而非句柄)
- D3D12 实现返回平台相关的渲染通道对象
**示例:**
```cpp
void* handle = renderPass->GetNativeHandle();
```

View File

@@ -0,0 +1,43 @@
# RHIRenderPass::Initialize
初始化渲染通道对象。
```cpp
virtual bool Initialize(
uint32_t colorAttachmentCount,
const AttachmentDesc* colorAttachments,
const AttachmentDesc* depthStencilAttachment
) = 0;
```
根据指定的附件配置创建并初始化渲染通道对象。
**参数:**
- `colorAttachmentCount` - 颜色附件数量
- `colorAttachments` - 颜色附件描述数组,长度必须等于 `colorAttachmentCount`
- `depthStencilAttachment` - 深度模板附件描述,可为 `nullptr`(如果不需要深度模板)
**返回:** `bool` - 初始化成功返回 `true`,失败返回 `false`
**线程安全:**
**注意:**
- `colorAttachmentCount` 必须大于 0
- 每个 `AttachmentDesc``format` 必须指定为有效的 `Format` 枚举值
- 渲染通道创建后不可修改其配置
**示例:**
```cpp
AttachmentDesc colorDesc;
colorDesc.format = Format::RGBA8_UNORM;
colorDesc.loadOp = LoadAction::Clear;
colorDesc.storeOp = StoreAction::Store;
AttachmentDesc depthDesc;
depthDesc.format = Format::D24_UNORM_S8_UINT;
depthDesc.loadOp = LoadAction::Clear;
depthDesc.storeOp = StoreAction::Store;
RHIRenderPass* pass = device->CreateRenderPass(1, &colorDesc, &depthDesc);
```

View File

@@ -0,0 +1,79 @@
# RHIRenderPass
**命名空间**: `XCEngine::RHI`
**类型**: `class (abstract)`
**头文件**: `XCEngine/RHI/RHIRenderPass.h`
**描述**: 渲染通道抽象接口,定义了渲染操作所需的附件配置和加载/存储行为。
## 概述
`RHIRenderPass` 是 RHI 抽象层的渲染通道接口,用于描述渲染操作所需的附件配置。每个渲染通道定义了:
- 颜色附件的数量和格式
- 深度/模板附件(可选)
- 每个附件的加载操作LoadAction
- 每个附件的存储操作StoreAction
- 清除值ClearValue
渲染通道是延迟渲染和多渲染目标MRT等高级渲染技术的基础它允许 GPU 预先知道帧缓冲配置,从而优化内存访问。
## AttachmentDesc 结构体
```cpp
struct AttachmentDesc {
Format format = Format::Unknown;
LoadAction loadOp = LoadAction::Undefined;
StoreAction storeOp = StoreAction::Store;
LoadAction stencilLoadOp = LoadAction::Undefined;
StoreAction stencilStoreOp = StoreAction::Undefined;
ClearValue clearValue;
};
```
| 成员 | 类型 | 描述 |
|------|------|------|
| `format` | `Format` | 附件的像素格式 |
| `loadOp` | `LoadAction` | 渲染前颜色数据的加载操作 |
| `storeOp` | `StoreAction` | 渲染后颜色数据的存储操作 |
| `stencilLoadOp` | `LoadAction` | 渲染前模板数据的加载操作 |
| `stencilStoreOp` | `StoreAction` | 渲染后模板数据的存储操作 |
| `clearValue` | `ClearValue` | 清除颜色值 |
## 公共方法
| 方法 | 描述 |
|------|------|
| [`Initialize`](initialize.md) | 初始化渲染通道 |
| [`Shutdown`](shutdown.md) | 关闭渲染通道 |
| [`GetNativeHandle`](get-native-handle.md) | 获取原生句柄 |
| [`GetColorAttachmentCount`](get-color-attachment-count.md) | 获取颜色附件数量 |
| [`GetColorAttachments`](get-color-attachments.md) | 获取颜色附件描述数组 |
| [`GetDepthStencilAttachment`](get-depth-stencil-attachment.md) | 获取深度模板附件描述 |
## 使用示例
```cpp
#include <XCEngine/RHI/RHIRenderPass.h>
// 配置颜色附件
AttachmentDesc colorAttachments[1];
colorAttachments[0].format = Format::RGBA8_UNORM;
colorAttachments[0].loadOp = LoadAction::Clear;
colorAttachments[0].storeOp = StoreAction::Store;
colorAttachments[0].clearValue.color = { 0.0f, 0.0f, 0.0f, 1.0f };
// 配置深度附件(可选)
AttachmentDesc depthAttachment;
depthAttachment.format = Format::D24_UNORM_S8_UINT;
depthAttachment.loadOp = LoadAction::Clear;
depthAttachment.storeOp = StoreAction::Store;
// 创建渲染通道
RHIRenderPass* renderPass = device->CreateRenderPass(1, colorAttachments, &depthAttachment);
```
## 相关文档
- [RHIFramebuffer](../framebuffer/framebuffer.md) - 帧缓冲接口

View File

@@ -0,0 +1,21 @@
# RHIRenderPass::Shutdown
关闭渲染通道并释放相关资源。
```cpp
virtual void Shutdown() = 0;
```
销毁渲染通道对象,释放底层图形 API 资源。调用后,渲染通道不再有效。
**线程安全:**
**注意:**
- 确保在没有任何帧缓冲正在使用此渲染通道时调用
- 调用此方法后,已创建的关联帧缓冲可能变为无效
**示例:**
```cpp
renderPass->Shutdown();
```

View File

@@ -40,7 +40,7 @@ RHI 模块将上层渲染逻辑与底层图形 API 解耦,通过抽象接口
| 类 | 文档 | 描述 |
|----|------|------|
| [RHIDevice](device/device.md) | `RHIDevice.h` | 渲染设备抽象,代表图形适配器实例 |
| [RHIFactory](rhifactory/rhifactory.md) | `RHIFactory.h` | 设备工厂,用于创建不同后端的设备实例 |
| [RHIFactory](factory/factory.md) | `RHIFactory.h` | 设备工厂,用于创建不同后端的设备实例 |
### 资源管理
@@ -49,6 +49,7 @@ RHI 模块将上层渲染逻辑与底层图形 API 解耦,通过抽象接口
| [RHIBuffer](buffer/buffer.md) | `RHIBuffer.h` | GPU 缓冲区资源,存储顶点、索引、常量等数据 |
| [RHITexture](texture/texture.md) | `RHITexture.h` | GPU 纹理资源,存储 1D/2D/3D 图像数据 |
| [RHIShader](shader/shader.md) | `RHIShader.h` | 着色器资源,管理顶点、像素等着色器程序 |
| [RHIFramebuffer](framebuffer/framebuffer.md) | `RHIFramebuffer.h` | 帧缓冲对象,管理渲染目标的颜色、深度和模板附件 |
### 命令执行
@@ -67,6 +68,7 @@ RHI 模块将上层渲染逻辑与底层图形 API 解耦,通过抽象接口
| [RHISampler](sampler/sampler.md) | `RHISampler.h` | 纹理采样器,配置纹理过滤和寻址模式 |
| [RHIPipelineLayout](pipeline-layout/pipeline-layout.md) | `RHIPipelineLayout.h` | 管线布局,定义着色器资源绑定布局 |
| [RHIDescriptorPool](descriptor-pool/descriptor-pool.md) | `RHIDescriptorPool.h` | 描述符池,管理 GPU 描述符分配 |
| [RHIRenderPass](render-pass/render-pass.md) | `RHIRenderPass.h` | 渲染通道,定义渲染操作的附件配置和加载/存储行为 |
### 类型与能力