I am trying to implement instancing inside my DirectX 12 renderer.
To do so I want to use a structured buffer that store each instance transformation.
Here how it is declared in my vertex shader:
struct MeshTransform
{
float4x4 mat;
};
StructuredBuffer<MeshTransform> meshTransforms : register(t0);
Now I need to upload that structured buffer from the CPU.
To do so I simply create a default heap initialized with the mesh transforms.
Here the problem, when I try to create the heap SRV I get this error:
D3D12 ERROR: ID3D12Device::CreateShaderResourceView: The Format (0, UNKNOWN) cannot be used when creating a View of a Buffer
Here how I create the 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);
}
So DirectX doesn't like the specified DXGI_FORMAT_UNKNOWN. What should I put then?
I checked the Microsoft Mini Engine code they seems to use DXGI_FORMAT_UNKNOWN when creating buffers:
https://github.com/microsoft/DirectX-Graphics-Samples/blob/master/MiniEngine/Core/GpuBuffer.cpp?plain=1#L189-216
What am I missing? Thanks for helping!
You didn't fill out the D3D12_SHADER_RESOURCE_VIEW_DESC::Buffer
member.
With DXGI_FORMAT_UNKNOWN
the runtime doesn't know the element stride so you have to specify in D3D12_BUFFER_SRV::StructureByteStride