Files
XCEngine/docs/api/rhi/rhi-command-list.md

180 lines
6.3 KiB
Markdown

# RHICommandList
**命名空间**: `XCEngine::RHI`
**类型**: `class` (abstract)
**描述**: GPU 命令列表抽象接口,用于录制和执行 GPU 命令。
## 概述
`RHICommandList` 封装了 GPU 命令的录制和执行。每个后端实现需要提供命令列表的创建、重置、命令录制和关闭等功能。
## 公共类型
### DepthStencilState
深度模板状态结构体。
```cpp
struct DepthStencilState {
bool depthEnable = true; // 启用深度测试
bool depthWriteMask = true; // 深度写入掩码
ComparisonFunc depthFunc; // 深度比较函数
bool stencilEnable = false; // 启用模板测试
uint8_t stencilReadMask = 0xFF; // 模板读取掩码
uint8_t stencilWriteMask = 0xFF; // 模板写入掩码
struct StencilOpDesc { // 模板操作描述
StencilOp stencilFailOp; // 模板失败操作
StencilOp stencilDepthFailOp; // 深度失败操作
StencilOp stencilPassOp; // 通过操作
ComparisonFunc stencilFunc; // 模板比较函数
};
StencilOpDesc frontFace; // 前面模板状态
StencilOpDesc backFace; // 背面模板状态
};
```
### BlendState
混合状态结构体。
```cpp
struct BlendState {
bool alphaToCoverageEnable = false; // Alpha 到覆盖
bool independentBlendEnable = false; // 独立混合
struct RenderTarget { // 渲染目标混合
bool blendEnable; // 启用混合
BlendFactor srcBlend; // 源混合因子
BlendFactor dstBlend; // 目标混合因子
BlendOp blendOp; // 混合操作
BlendFactor srcBlendAlpha; // Alpha 源混合
BlendFactor dstBlendAlpha; // Alpha 目标混合
BlendOp blendOpAlpha; // Alpha 混合操作
uint8_t renderTargetWriteMask; // 颜色写入掩码
};
RenderTarget renderTargets[8]; // 每个 RT 的混合状态
float blendFactor[4]; // 全局混合因子
};
```
## 公共方法
### 生命周期
| 方法 | 描述 |
|------|------|
| `virtual void Shutdown()` | 释放命令列表资源 |
### 命令录制控制
| 方法 | 描述 |
|------|------|
| `virtual void Reset()` | 重置命令列表,开始新的录制 |
| `virtual void Close()` | 关闭命令列表,结束录制 |
### 资源状态转换
| 方法 | 描述 |
|------|------|
| `virtual void TransitionBarrier(void* resource, ResourceStates stateBefore, ResourceStates stateAfter)` | 资源状态转换屏障 |
### 渲染状态设置
| 方法 | 描述 |
|------|------|
| `virtual void SetPipelineState(void* pso)` | 设置管线状态对象 |
| `virtual void SetPrimitiveTopology(PrimitiveTopology topology)` | 设置图元拓扑 |
| `virtual void SetViewport(const Viewport& viewport)` | 设置视口 |
| `virtual void SetViewports(uint32_t count, const Viewport* viewports)` | 设置多个视口 |
| `virtual void SetScissorRect(const Rect& rect)` | 设置裁剪矩形 |
| `virtual void SetScissorRects(uint32_t count, const Rect* rects)` | 设置多个裁剪矩形 |
| `virtual void SetRenderTargets(uint32_t count, void** renderTargets, void* depthStencil = nullptr)` | 设置渲染目标 |
### 深度/混合状态
| 方法 | 描述 |
|------|------|
| `virtual void SetDepthStencilState(const DepthStencilState& state)` | 设置深度模板状态 |
| `virtual void SetStencilRef(uint8_t ref)` | 设置模板参考值 |
| `virtual void SetBlendState(const BlendState& state)` | 设置混合状态 |
| `virtual void SetBlendFactor(const float factor[4])` | 设置混合因子 |
### 顶点/索引缓冲
| 方法 | 描述 |
|------|------|
| `virtual void SetVertexBuffer(uint32_t slot, void* buffer, uint64_t offset, uint32_t stride)` | 设置顶点缓冲 |
| `virtual void SetVertexBuffers(uint32_t startSlot, uint32_t count, const uint64_t* buffers, const uint64_t* offsets, const uint32_t* strides)` | 设置多个顶点缓冲 |
| `virtual void SetIndexBuffer(void* buffer, uint64_t offset, Format format)` | 设置索引缓冲 |
### 绘制命令
| 方法 | 描述 |
|------|------|
| `virtual void Draw(uint32_t vertexCount, uint32_t instanceCount = 1, uint32_t startVertex = 0, uint32_t startInstance = 0)` | 绘制调用 |
| `virtual void DrawIndexed(uint32_t indexCount, uint32_t instanceCount = 1, uint32_t startIndex = 0, int32_t baseVertex = 0, uint32_t startInstance = 0)` | 索引绘制调用 |
### 清除命令
| 方法 | 描述 |
|------|------|
| `virtual void Clear(float r, float g, float b, float a, uint32_t buffers)` | 清除缓冲 |
| `virtual void ClearRenderTarget(void* renderTarget, const float color[4])` | 清除渲染目标 |
| `virtual void ClearDepthStencil(void* depthStencil, float depth, uint8_t stencil)` | 清除深度模板 |
### 资源复制
| 方法 | 描述 |
|------|------|
| `virtual void CopyResource(void* dst, void* src)` | 复制资源 |
### 计算着色器
| 方法 | 描述 |
|------|------|
| `virtual void Dispatch(uint32_t x, uint32_t y, uint32_t z)` | 分发计算着色器 |
## 图元拓扑类型 (PrimitiveTopology)
| 枚举值 | 描述 |
|--------|------|
| `PointList` | 点列表 |
| `LineList` | 线段列表 |
| `LineStrip` | 线段条带 |
| `TriangleList` | 三角形列表 |
| `TriangleStrip` | 三角形条带 |
| `PatchList` | 补丁列表(曲面细分) |
## 使用示例
```cpp
// 重置命令列表
commandList->Reset();
// 设置渲染状态
commandList->SetPipelineState(pipelineState);
commandList->SetPrimitiveTopology(PrimitiveTopology::TriangleList);
commandList->SetViewport(viewport);
commandList->SetRenderTargets(1, &renderTarget, depthStencil);
// 设置顶点缓冲
commandList->SetVertexBuffer(0, vertexBuffer->GetNativeHandle(), 0, sizeof(Vertex));
commandList->SetIndexBuffer(indexBuffer->GetNativeHandle(), 0, Format::R32_UInt);
// 绘制
commandList->DrawIndexed(indexCount, 1, 0, 0, 0);
// 关闭命令列表
commandList->Close();
// 提交到命令队列执行
commandQueue->ExecuteCommandLists(1, (void**)&commandList);
```
## 相关文档
- [RHICommandQueue](./rhi-command-queue.md) - 命令队列
- [RHIPipelineState](./rhi-pipeline-state.md) - 管线状态
- [RHIDevice](./rhi-device.md) - 创建设备