我正在尝试在我的 DirectX 12 渲染器中实现实例化。
为此,我想使用存储每个实例转换的结构化缓冲区。
这是它在我的顶点着色器中的声明方式:
struct MeshTransform
{
float4x4 mat;
};
StructuredBuffer<MeshTransform> meshTransforms : register(t0);
现在我需要从 CPU 上传结构化缓冲区。
为此,我只需创建一个使用网格变换初始化的默认堆。
这里的问题是,当我尝试创建堆 SRV 时,出现此错误:
D3D12 错误:ID3D12Device::CreateShaderResourceView:创建缓冲区视图时无法使用格式(0,未知)
这是我如何创建 SRV:
struct DirectX12StructuredBufferHandle
{
DescriptorHandle srvDescriptorHandle;
DescriptorHandle uavDescriptorHandle;
ID3D12Resource* buffer = nullptr;
};
void DirectX12Renderer::createSRV(DirectX12StructuredBufferHandle& dst)
{
D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {};
srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
srvDesc.Format = DXGI_FORMAT_UNKNOWN;
srvDesc.ViewDimension = D3D12_SRV_DIMENSION_BUFFER;
dst.srvDescriptorHandle = m_cbs_srv_uavAllocator->allocate({ dst.buffer }, srvDesc);
}
所以 DirectX 不喜欢指定的 DXGI_FORMAT_UNKNOWN。那我应该放什么?
我检查了 Microsoft Mini Engine 代码,他们在创建缓冲区时似乎使用 DXGI_FORMAT_UNKNOWN:
https://github.com/microsoft/DirectX-Graphics-Samples/blob/master/MiniEngine/Core/GpuBuffer.cpp?plain=1#L189-216
我错过了什么? 感谢您的帮助!
您没有填写
D3D12_SHADER_RESOURCE_VIEW_DESC::Buffer
会员。
使用
DXGI_FORMAT_UNKNOWN
时,运行时不知道元素步幅,因此您必须在 D3D12_BUFFER_SRV::StructureByteStride
中指定