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

6.3 KiB

RHICommandList

命名空间: XCEngine::RHI

类型: class (abstract)

描述: GPU 命令列表抽象接口,用于录制和执行 GPU 命令。

概述

RHICommandList 封装了 GPU 命令的录制和执行。每个后端实现需要提供命令列表的创建、重置、命令录制和关闭等功能。

公共类型

DepthStencilState

深度模板状态结构体。

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

混合状态结构体。

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 补丁列表(曲面细分)

使用示例

// 重置命令列表
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);

相关文档