2.7 KiB
2.7 KiB
D3D12Shader
DirectX 12 着色器的 D3D12 实现,封装了 ID3DBlob 编译结果。
头文件
#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 |
输入布局 |
使用示例
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