如何在 DirectX 12 下为结构化缓冲区创建视图?

问题描述 投票:0回答:1

我正在尝试在我的 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

我错过了什么? 感谢您的帮助!

graphics 3d directx directx-12
1个回答
0
投票

您没有填写

D3D12_SHADER_RESOURCE_VIEW_DESC::Buffer
会员。

使用

DXGI_FORMAT_UNKNOWN
时,运行时不知道元素步幅,因此您必须在
D3D12_BUFFER_SRV::StructureByteStride

中指定

https://github.com/microsoft/DirectX-Graphics-Samples/blob/b5f92e2251ee83db4d4c795b3cba5d470c52eaf8/MiniEngine/Core/GpuBuffer.cpp?plain=1#L195-L197

© www.soinside.com 2019 - 2024. All rights reserved.