# D3D12Shader DirectX 12 着色器的 D3D12 实现,封装了 `ID3DBlob` 编译结果。 ## 头文件 ```cpp #include ``` ## 继承关系 ``` 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` | 编译成功的字节码 | | `m_error` | `ComPtr` | 编译错误信息 | | `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`