# D3D12PipelineState DirectX 12 管线状态对象的 D3D12 实现,封装了 `ID3D12PipelineState`。 ## 头文件 ```cpp #include ``` ## 继承关系 ``` RHIPipelineState (interface) └── D3D12PipelineState (implementation) ``` ## 公共成员函数 ### 构造函数与析构函数 #### `D3D12PipelineState()` 默认构造函数。 #### `~D3D12PipelineState() override` 析构函数,确保调用 `Shutdown()`。 ### 初始化 #### `bool Initialize(ID3D12Device* device, const D3D12_GRAPHICS_PIPELINE_STATE_DESC& desc)` 使用 D3D12 PSO 描述初始化。 - `device`: D3D12 设备 - `desc`: 完整的图形管线状态描述 - 返回: 初始化是否成功 #### `void Shutdown() override` 释放 PSO 资源。 ### 原生接口 #### `ID3D12PipelineState* GetPipelineState() const` 获取底层 `ID3D12PipelineState` 指针。 #### `void* GetNativeHandle() override` 返回原生句柄。 #### `PipelineType GetType() const override` 返回 `PipelineType::Graphics`。 ### 绑定 #### `void Bind() override` 绑定 PSO 到命令列表。 #### `void Unbind() override` 解绑 PSO。 ### 静态辅助函数 #### `static D3D12_GRAPHICS_PIPELINE_STATE_DESC CreateDesc(...)` 创建完整的 PSO 描述。 参数: - `ID3D12RootSignature* rootSignature`: 根签名 - `const D3D12_SHADER_BYTECODE& vs`: 顶点着色器 - `const D3D12_SHADER_BYTECODE& ps`: 像素着色器 - `const D3D12_SHADER_BYTECODE& gs`: 几何着色器(可选) - `uint32_t inputElementCount`: 输入元素数量 - `const D3D12_INPUT_ELEMENT_DESC* inputElements`: 输入元素数组 #### `static D3D12_INPUT_ELEMENT_DESC CreateInputElement(...)` 创建输入元素描述,有两个重载: - 带 `alignedByteOffset` 参数 - 自动计算 `alignedByteOffset` 参数 参数: - `semanticName`: 语义名称 (e.g., "POSITION", "TEXCOORD") - `semanticIndex`: 语义索引 - `format`: 格式 - `inputSlot`: 输入槽 - `alignedByteOffset`: 对齐偏移(可选) ## 内部成员 | 成员 | 类型 | 描述 | |------|------|------| | `m_pipelineState` | `ComPtr` | D3D12 PSO 对象 | ## 使用示例 ```cpp // Define input layout D3D12_INPUT_ELEMENT_DESC inputElements[] = { D3D12PipelineState::CreateInputElement("POSITION", 0, Format::R32G32B32A32_Float, 0), D3D12PipelineState::CreateInputElement("TEXCOORD", 0, Format::R32G32_Float, 1), }; // Create PSO description D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc = {}; psoDesc.pRootSignature = rootSignature->GetRootSignature(); psoDesc.VS = vertexShader.GetD3D12Bytecode(); psoDesc.PS = pixelShader.GetD3D12Bytecode(); psoDesc.InputLayout = { inputElements, 2 }; psoDesc.RasterizerState = ...; psoDesc.BlendState = ...; psoDesc.DepthStencilState = ...; psoDesc.SampleMask = UINT_MAX; psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; psoDesc.NumRenderTargets = 1; psoDesc.RTVFormats[0] = DXGI_FORMAT_R8G8B8A8_UNORM; psoDesc.DSVFormat = DXGI_FORMAT_D24_UNORM_S8_UINT; psoDesc.SampleDesc.Count = 1; D3D12PipelineState pso; pso.Initialize(device->GetDevice(), psoDesc); pso.Bind(); ``` ## 备注 - PSO 一旦创建不可修改,只能重新创建 - PSO 创建开销大,应缓存复用 - `ID3D12PipelineState` 是不可变对象,切换开销比 OpenGL 小