109 lines
2.7 KiB
Markdown
109 lines
2.7 KiB
Markdown
|
|
# D3D12Shader
|
||
|
|
|
||
|
|
DirectX 12 着色器的 D3D12 实现,封装了 `ID3DBlob` 编译结果。
|
||
|
|
|
||
|
|
## 头文件
|
||
|
|
|
||
|
|
```cpp
|
||
|
|
#include <XCEngine/RHI/D3D12/D3D12Shader.h>
|
||
|
|
```
|
||
|
|
|
||
|
|
## 继承关系
|
||
|
|
|
||
|
|
```
|
||
|
|
RHIShader (interface)
|
||
|
|
└── D3D12Shader (implementation)
|
||
|
|
```
|
||
|
|
|
||
|
|
## 公共成员函数
|
||
|
|
|
||
|
|
### 构造函数与析构函数
|
||
|
|
|
||
|
|
#### `D3D12Shader()`
|
||
|
|
默认构造函数。
|
||
|
|
|
||
|
|
#### `~D3D12Shader() override`
|
||
|
|
析构函数,确保调用 `Shutdown()`。
|
||
|
|
|
||
|
|
### 编译
|
||
|
|
|
||
|
|
#### `bool CompileFromFile(const wchar_t* filePath, const char* entryPoint, const char* target) override`
|
||
|
|
从文件编译着色器。
|
||
|
|
- `filePath`: HLSL 文件路径
|
||
|
|
- `entryPoint`: 入口点函数名 (e.g., "VS", "PS")
|
||
|
|
- `target`: 着色器目标 (e.g., "vs_5_1", "ps_5_1", "cs_5_1")
|
||
|
|
- 返回: 编译是否成功
|
||
|
|
|
||
|
|
#### `bool Compile(const void* sourceData, size_t sourceSize, const char* entryPoint, const char* target) override`
|
||
|
|
从内存编译着色器。
|
||
|
|
- `sourceData`: 着色器源代码
|
||
|
|
- `sourceSize`: 代码大小
|
||
|
|
- `entryPoint`: 入口点
|
||
|
|
- `target`: 目标
|
||
|
|
- 返回: 编译是否成功
|
||
|
|
|
||
|
|
#### `void Shutdown() override`
|
||
|
|
释放着色器编译结果。
|
||
|
|
|
||
|
|
### 着色器信息
|
||
|
|
|
||
|
|
#### `const D3D12_SHADER_BYTECODE GetD3D12Bytecode() const`
|
||
|
|
获取 D3D12 着色器字节码结构。
|
||
|
|
|
||
|
|
#### `const void* GetBytecode() const`
|
||
|
|
获取字节码指针。
|
||
|
|
|
||
|
|
#### `size_t GetBytecodeSize() const`
|
||
|
|
获取字节码大小。
|
||
|
|
|
||
|
|
#### `ShaderType GetType() const override`
|
||
|
|
获取着色器类型。
|
||
|
|
|
||
|
|
#### `const InputLayoutDesc& GetInputLayout() const`
|
||
|
|
获取输入布局描述。
|
||
|
|
|
||
|
|
### 接口实现
|
||
|
|
|
||
|
|
#### `void* GetNativeHandle() override`
|
||
|
|
返回字节码指针。
|
||
|
|
|
||
|
|
#### `bool IsValid() const override`
|
||
|
|
检查着色器是否有效。
|
||
|
|
|
||
|
|
#### `void Bind() override / Unbind() override`
|
||
|
|
绑定/解绑(空实现)。
|
||
|
|
|
||
|
|
#### `void SetInt/SetFloat/SetVec3/SetVec4/SetMat4(...)`
|
||
|
|
设置着色器变量(空实现,实际通过根签名绑定)。
|
||
|
|
|
||
|
|
## 内部成员
|
||
|
|
|
||
|
|
| 成员 | 类型 | 描述 |
|
||
|
|
|------|------|------|
|
||
|
|
| `m_bytecode` | `ComPtr<ID3DBlob>` | 编译成功的字节码 |
|
||
|
|
| `m_error` | `ComPtr<ID3DBlob>` | 编译错误信息 |
|
||
|
|
| `m_type` | `ShaderType` | 着色器类型 |
|
||
|
|
| `m_inputLayout` | `InputLayoutDesc` | 输入布局 |
|
||
|
|
|
||
|
|
## 使用示例
|
||
|
|
|
||
|
|
```cpp
|
||
|
|
D3D12Shader vertexShader;
|
||
|
|
if (vertexShader.CompileFromFile(L"shaders/DefaultVS.hlsl", "main", "vs_5_1")) {
|
||
|
|
auto bytecode = vertexShader.GetD3D12Bytecode();
|
||
|
|
// Use in PSO description
|
||
|
|
}
|
||
|
|
|
||
|
|
D3D12Shader pixelShader;
|
||
|
|
pixelShader.CompileFromFile(L"shaders/DefaultPS.hlsl", "main", "ps_5_1");
|
||
|
|
|
||
|
|
D3D12Shader computeShader;
|
||
|
|
computeShader.CompileFromFile(L"shaders/CopyCS.hlsl", "main", "cs_5_1");
|
||
|
|
```
|
||
|
|
|
||
|
|
## 备注
|
||
|
|
|
||
|
|
- 编译错误信息存储在 `m_error` 中,可输出到日志
|
||
|
|
- 字节码用于创建 Pipeline State Object
|
||
|
|
- 着色器目标格式: `{type}_{major}_{minor}`, e.g., `vs_5_1`, `ps_6_0`
|