D3D12的數(shù)據(jù)綁定(Root Signatrue、Descriptor)

一,資源綁定。說白了就是把cpu的數(shù)據(jù)映射給gpu用。所有的數(shù)據(jù)其實根本還是一維數(shù)組的形式一字排開躺在內(nèi)存或者顯存中,只不過因為各自的架構(gòu)不一樣,一個非要把面粉做成饅頭吃,一個非要把面粉做成面包吃。

dx中最基本的資源就兩大類:1)Textrue類(1D,2D,3D等),就是模型的貼圖,再直白點就是dx支持的圖片;2)Buffer類(Consttant,Vertex,Index等等),其實就是個內(nèi)存塊。

二,Descriptor 。上面的資源直接給GPU人家是不認的,人家就吃面包,所以就有各種View(Vertex Buffer View 、Index Buffer View ),所有的這些View的作用就把一些原始數(shù)據(jù)描述成GPU能接受的數(shù)據(jù)格式,這也就是Descriptor。各個Descriptor又分類放在Descriptor Table當(dāng)中,Descriptor Table又放在了Descriptor Heap當(dāng)中。

三,Root Signature。Shader(就是.hlsl)就相當(dāng)于我們的c++代碼,數(shù)據(jù)是通過它在GPU上使用的,而Descriptor Heap也不是直接拿給Shader使用的,它是通過Root Signature中定制的形式提供給GPU使用的。Root Signature可以存放三種數(shù)據(jù)1)索引Descriptor Heap中的Descriptor Table;2)直接綁定數(shù)據(jù)給shader用(如 root contant),而不用通過Descriptor 或者Tales;3)小數(shù)量的Descriptors,這些Descriptors經(jīng)常變化(注意和上面的區(qū)別,這個叫root CBV)

下面是官方文檔中關(guān)于Root Signature的例圖

1

GPU中不同的資源存放在不同的寄存器當(dāng)中,比如設(shè)置一個cvb寄存器位置為0,那它就對應(yīng)于shader中的regester(b0),srv對于tx等等,其中root CBV、table中cbv、root?constant都對應(yīng)bx


默認Demo中,有兩種數(shù)據(jù):1)用于正方體每幀旋轉(zhuǎn)的MVP矩陣;2)正方體的基礎(chǔ)數(shù)據(jù)(頂點的位置、索引、顏色)

1,MVP矩陣

1)其中bufferData就是我們定義的c++結(jié)構(gòu)體,最原始數(shù)據(jù)。因為使用的是三重緩沖區(qū),剩下兩個是計算偏移的

2


2)生成Root Signature,注意這里是添加了一個含有一個CBV的Descriptor Table

3)創(chuàng)建Descriptor?heap,并創(chuàng)建CBV。注意變量的前綴中的CPU、GPU字樣,有助于我們理解這是cpu資源還是gpu資源。還有一個就是圖片中所說的疑問。


4)update中更新游戲邏輯,demo中的游戲邏輯就是旋轉(zhuǎn),更改MVP的值。還有更改窗口大小,也會更新常量緩沖區(qū)

5)Render。將已經(jīng)準備好的數(shù)據(jù)提交給GPU,完成這個物體的繪制。Root Signature更多的類似一個聲明,真正的數(shù)據(jù)是在heap。通過這個過程,并沒有發(fā)現(xiàn)Root?Signature和heap之間有之前推測的索引關(guān)系,這個需要再繼續(xù)求證下

2,正方體的基礎(chǔ)數(shù)據(jù)。注意的是Vertex Buffer、Index Buffer、Stream output buffers、Render targets、Depth stencil views不放在table或者heap中,他們是直接使用comond?list綁定

1)聲明數(shù)據(jù)的形式。右邊是頂點著色器中的聲明

2)初始化數(shù)據(jù)。此處有個疑問是為什么要創(chuàng)建一個上載堆?

3)創(chuàng)建視圖


4)設(shè)置視圖


前文有兩個地方說的有問題:

1,Descriptor Table存放在Heap當(dāng)中

其實heap當(dāng)中存放的是一個一個的descriptor,并沒有table。table的概念只存在于root signature當(dāng)中,它記錄的heap中的起始位置和便宜??梢赃@么理解,root signature中存放的是形參(Parameter),而Heap當(dāng)中存放的是實參(Argument)

2,1 5)中二者索引關(guān)系的問題。二者是有索引關(guān)系的,當(dāng)時圖中理解的關(guān)系也有問題。正確的應(yīng)該是下圖。

類似于下面的過程



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容