DX12学习笔记(龙书)(小点1:资源与描述符)

在渲染处理的过程中,GPU可能会对资源进行读(从存有3D场景中集合体位置信息的缓冲区中读取数据)

和 写(向后台缓冲区或深度/模板缓冲区写入数据)两种操作。

在发出绘制命令之前,我们需要,将本次绘制调调用相关的资源link-bind到渲染流水线上。

——————————————解释【渲染流水线】

部分资源在每次绘制调用是都会有变化,所以我们也就要按每次按需更新绑定。

但是GPU资源并非直接与渲染流水线相绑定

GPU---->(取)------渲染流水线(不对)

GPU----<(描述符 descriptor)------渲染流水线。

描述符可以被看做一种对送往GPU的资源进行描述的轻量级结构。被指定后,GPU可以获得实际数据,也了解这个数据的信息。

所以,我们将把绘制调用需要引用的资源,通过指定描述符的方式绑定到渲染流水线。

就是说,我们在做

-----描述符,资源>(放入)渲染流水线。这样的工作。

这样方便到时候取。

 

我们通过创建【描述符堆】来储存程序中要用到的描述符/视图。

ID3D12DescriptorHeap接口来表示描述符堆。并用ID3D12Device::CreateDescriptorHeap方法来创建它。

ComPtr mPtvHeap;

 

void D3DApp::CreateRtvAndDsvDescriptorHeaps()

{

D3D12_DESCRIPTOR_HEAP_DESC rtvHeapDesc;(我猜这个应该是对将要形成的Heap进行配置的一个结构体)

rtvHeapDesc.NumDescriptors=SwapChainBufferCount;有几个描述符,一般有几个缓冲区资源就要有几个描述符

rtvHeapDesc.Type=D3D12_DESCRIPTOR_HEAP_TYPE_RTV(表示RTV上的情况)

rtvHeapDesc.Flags=D3D12_DESCRIPTOR_HEAP_FLAG_NONE;

rtvHeapDesc.NodeMask=0

开始生成啦!

ThrowIfFailed(md3dDevice->CreateDescriptorHeap(&rtvHeapDesc,IID_PPV_ARGS(mRtvHeap.GetAddressOf()))

(把配置的内容、mPtvHeap的地址传了了进去。

那么,我的问题是,最后需要调用数据的时候,被调用的是mRtvHeap?还是直接调用……(有人会规定好位置)。

 

符建立好了。但是它似乎什么都没有。对不,它只有一个标记。

但是它可以从mRtvHeap这里进行访问和处理,莫非mRtv就是那个来处理的东西?

它需要绑定到资源。然后GPU通过叫它的名字来获得资源!?一定是如此了。

创建的描述符之后,还要能访问。在程序中,我们通过句柄来引用描述符的,并以ID3D12DescriptorHeap::GetCPUDescriptorHandleForHeapStart方法来获得描述符堆 中 第一个描述符的句柄。

D3D12_CPU_DESCRIPTOR_HANDLE D3DApp::CurrentBackBufferView() const

{

return CD3DX12_CPU_DESCRIPTOR_HANDLE(

mRtvHeap->GetCpuDescriptorHandleForHeapStart(),

mCurrBackBuffer, (!!!!!!这是啥) 这是偏移至后台缓冲区描述符句柄的索引。难道只是堆里面的索引嘛。那倒是可以理解,因为一个堆里面也许有很多个符。通过这个找到对应的那个符

mRtvDescriptorSize)

}

为啥我觉得mCurrBackBuffer可以表示偏移呢。因为如果不给GetCPUDescriptorHandleForHeapStart填后面两个值,也是可以。比如一个只存了一个描述符的描述符堆。它获得句柄的方式就是

mDsvHeap->GetCpuDescriptorHandleForHeapStart()

所以这个mRtvDescriptorSize,必须存在,因为为了用偏移量找到当前后台缓冲区的RTV描述符,我们必须要知道RTV描述符的大小。

句柄=GetCpuDescriptorHandleForHeapStart()+mCurrBackBuffer

因为有些时候不太懂CD3DX12_CPU_DESCRIPTOR_HANDLE这是个啥玩意,是一个函数没错^ ^

 

 

 

 

 

你可能感兴趣的:(DX12学习笔记(龙书)(小点1:资源与描述符))