文章目录
前言
前些日子写过一篇有关 cbuffer / tbuffer / StructuredBuffer 的文章,那篇文章描述了在 D3D11 中如何使用这些资源,代码也是基于 D3D11 的。这次我将向大家展示在 D3D12 中如何使用这些资源。
一、准备资源
这次我们以微软官方 DirectX Graphics Samples master 中的 HelloConstBuffers 例子为基础,修改其代码和资源来完成讲解。
这个例子非常简单,原始的版本就是一个三角形在屏幕上移动。我们将对其进行改动,使其增加一个可以变色的功能。我们就通过移动和变色这两个功能把数据分别放到不同的资源中来展示其用法。最终的效果如图

二、在 D3D12 中使用 cbuffer / tbuffer / StructuredBuffer
1. Root Signature
D3D12 使用 Root Signature 来建立 Shader 和其使用的资源之间的联系。我们在之后会使用到的参数类型会有
- D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE
- D3D12_ROOT_PARAMETER_TYPE_CBV
- D3D12_ROOT_PARAMETER_TYPE_SRV
前面说过我们需要两个功能,一个是移动三角形也就是需要一个 Position 的参数,另一个是使其变色也就是需要一个 Color 的参数。我们就把 Position 定义为参数 0,把 Color 定义为参数 1。下面的代码就是准备两个参数。
CD3DX12_ROOT_PARAMETER1 rootParameters[2];
2. 把 Position 参数放进 cbuffer 中
(1)在 Shader 中使用 cbuffer
cbuffer TrianglePosition
{
float4 g_f4Offset;
};
(2)在程序中创建 cbuffer
cbuffer 就是最原始的 Constant Buffer。它创建在 Upload Heap 上,只读,可以使用 Map 进行数据更新。
m_device->CreateCommittedResource(
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),
D3D12_HEAP_FLAG_NONE,
&CD3DX12_RESOURCE_DESC::Buffer(1024*64),
D3D12_RESOURCE_STATE_GENERIC_READ,
nullptr,
IID_PPV_ARGS(&m_spCBTrianglePosition)
);
(3)在 Root Signature 中创建 cbuffer 参数
// Position :参数 0,静态 GPU 只读,仅 Vertex Shader 可见
// 这里实际上使用的 D3D12_ROOT_PARAMETER_TYPE_CBV
rootParameters[0].InitAsConstantBufferView(0, 0, D3D12_ROOT_DESCRIPTOR_FLAG_DATA_STATIC, D3D12_SHADER_VISIBILITY_VERTEX);
(4)把 cbuffer 绑定到 pipeline 上

本文详细介绍了如何在 Direct3D 12 中使用 cbuffer、tbuffer 和 StructuredBuffer。通过一个简单的三角形移动和变色的例子,展示了它们在资源管理、Root Signature、Shader中的应用及其区别,帮助读者深入理解这些缓冲区资源的使用方式。
最低0.47元/天 解锁文章
1197

被折叠的 条评论
为什么被折叠?



