Files
XCEngine/docs/api/rhi/d3d12/d3d12-shader.md

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