首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DirectX12允许我们使用AppendStructuredBuffer还是ConsumeStructuredBuffer?

DirectX12允许我们使用AppendStructuredBuffer还是ConsumeStructuredBuffer?
EN

Stack Overflow用户
提问于 2022-09-22 10:11:22
回答 1查看 93关注 0票数 1

在“用DirectX 12进行3D游戏编程”(“龙书”)第13章中,几何Shader.It描述了一个使用AppendStructuredBuffer和ConsumeStructuredBuffer的例子,但没有详细的代码。我试着使用这种缓冲区,但是failed.So不知道是否允许在DirectX 12中使用AppendStructuredBuffer或ConsumeStructuredBuffer ?如何使用它,我应该如何设置rootSignature?

代码语言:javascript
复制
ConsumeStructuredBuffer<int3> gInput : register(u0);
AppendStructuredBuffer<float> gOutput : register(u1);

[numthreads(64, 1, 1)]
void CS(int3 dispatchThreadID : SV_DispatchThreadID)
{
    // gOutput[dispatchThreadID.x] = length(gInput[dispatchThreadID.x]);
    int3 p = gInput.Consume();
    gOutput.Append(length(float3(p)));
}

我在AppendStructuredBuffer的官方文档中找到了一些使用directx12的技巧。

上面写着:

代码语言:javascript
复制
The UAV format bound to this resource needs to be created with the DXGI_FORMAT_UNKNOWN format.
The UAV bound to this resource must have been created with D3D11_BUFFER_UAV_FLAG_APPEND.

所以我试着构建UAV,它的堆和使用描述符table.When --我填充了D3D12_UNORDERED_ACCESS_VIEW_DESC的成员,我被困住了。

代码语言:javascript
复制
D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc;
uavDesc.Format = DXGI_FORMAT_UNKNOWN; 
uavDesc.ViewDimension = D3D12_UAV_DIMENSION_BUFFER;
uavDesc.Buffer.FirstElement = 0;
uavDesc.Buffer.NumElements = 64;
uavDesc.Buffer.Flags = D3D11_BUFFER_UAV_FLAG_APPEND; // ????

在DirectX 12中没有这样的枚举成员。

EN

回答 1

Stack Overflow用户

发布于 2022-09-23 18:45:20

在d3d11中,附加缓冲区通常以不透明的方式存储,因此在创建UAV时必须指定标志。

在d3d12中,此计数器存储在您提供的gpu缓冲区中。

如果我们看看ID3D12设备::CreateUnorderedAccessView

代码语言:javascript
复制
void CreateUnorderedAccessView(
       ID3D12Resource                         *pResource,
       ID3D12Resource                         *pCounterResource,
       const D3D12_UNORDERED_ACCESS_VIEW_DESC *pDesc,
       [in] D3D12_CPU_DESCRIPTOR_HANDLE            DestDescriptor
);

pCounterResource指定包含计数器的缓冲区,因此如果将其设置为nullptr,则只能使用RW类型的UAV,如果指定缓冲区,则允许在着色器中使用它作为附加/消耗或使用增量/减少计数器。

请注意,重新设置计数器现在是自己做的。

这是使用:ID3D12GraphicsCommandList::ClearUnorderedAccessViewUint完成的。

您还可以使用计算着色器来更改缓冲区值,因此您不限于只重置CPU,这在某些用例中是很好的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73812887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档