124 lines
3.2 KiB
Markdown
124 lines
3.2 KiB
Markdown
# D3D12PipelineState
|
|
|
|
DirectX 12 管线状态对象的 D3D12 实现,封装了 `ID3D12PipelineState`。
|
|
|
|
## 头文件
|
|
|
|
```cpp
|
|
#include <XCEngine/RHI/D3D12/D3D12PipelineState.h>
|
|
```
|
|
|
|
## 继承关系
|
|
|
|
```
|
|
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<ID3D12PipelineState>` | 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 小
|