在“用DirectX 12进行3D游戏编程”(“龙书”)第13章中,几何Shader.It描述了一个使用AppendStructuredBuffer和ConsumeStructuredBuffer的例子,但没有详细的代码。我试着使用这种缓冲区,但是failed.So不知道是否允许在DirectX 12中使用AppendStructuredBuffer或ConsumeStructuredBuffer ?如何使用它,我应该如何设置rootSignature?
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的技巧。
上面写着:
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的成员,我被困住了。
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中没有这样的枚举成员。
发布于 2022-09-23 18:45:20
在d3d11中,附加缓冲区通常以不透明的方式存储,因此在创建UAV时必须指定标志。
在d3d12中,此计数器存储在您提供的gpu缓冲区中。
如果我们看看ID3D12设备::CreateUnorderedAccessView,
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,这在某些用例中是很好的。
https://stackoverflow.com/questions/73812887
复制相似问题