再探 cbuffer / tbuffer / StructuredBuffer

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


前言

前些日子写过一篇有关 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 上


                
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值