在渲染处理的过程中,GPU可能会对资源进行读(从存有3D场景中集合体位置信息的缓冲区中读取数据)
和 写(向后台缓冲区或深度/模板缓冲区写入数据)两种操作。
在发出绘制命令之前,我们需要,将本次绘制调调用相关的资源link-bind到渲染流水线上。
——————————————解释【渲染流水线】
部分资源在每次绘制调用是都会有变化,所以我们也就要按每次按需更新绑定。
但是GPU资源并非直接与渲染流水线相绑定
GPU---->(取)------渲染流水线(不对)
GPU----<(描述符 descriptor)------渲染流水线。
描述符可以被看做一种对送往GPU的资源进行描述的轻量级结构。被指定后,GPU可以获得实际数据,也了解这个数据的信息。
所以,我们将把绘制调用需要引用的资源,通过指定描述符的方式绑定到渲染流水线。
就是说,我们在做
-----描述符,资源>(放入)渲染流水线。这样的工作。
这样方便到时候取。
我们通过创建【描述符堆】来储存程序中要用到的描述符/视图。
ID3D12DescriptorHeap接口来表示描述符堆。并用ID3D12Device::CreateDescriptorHeap方法来创建它。
ComPtr
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这是个啥玩意,是一个函数没错^ ^