Introduction

我們現(xiàn)在可以將任意屬性傳遞給每個頂點的頂點著色器使用。但是全局變量呢?我們將會從本章開始介紹3D圖形相關的內(nèi)容,并需要一個模型視圖投影矩陣。我們確實可以將它一頂點的方式包含,但是這非常浪費帶寬、內(nèi)存,并且需要我們在變換的時候更新頂點緩沖區(qū)的數(shù)據(jù)。這種變換通常發(fā)生在每一幀。

 

在Vulkan中正確處理此問題的途徑是使用資源描述符。描述符是著色器資源訪問諸如緩沖區(qū)和圖像這樣資源的一種方式。我們需要設置一個包含轉(zhuǎn)換矩陣的緩沖區(qū),并使頂點著色器通過描述符訪問它們。描述符的使用由三部分組成:

  • 在管線創(chuàng)建時指定描述符的布局結(jié)構(gòu)

  • 從描述符對象池中分配描述符集合

  • 在渲染階段綁定描述符集合

描述符布局指定了管線訪問的資源的類型,就像渲染通道指定附件的類型一樣。描述符集合指定將綁定到描述符的實際緩沖區(qū)或映射資源。就像幀緩沖區(qū)為綁定渲染通道的附件而指定實際的圖像視圖一樣。描述符集合就像頂點緩沖區(qū)和幀緩沖區(qū)一樣被綁定到繪制命令。

 

有許多類型的描述符,但在本章中,我們將使用統(tǒng)一的緩沖區(qū)對象uniform buffer objects(UBO)。我們將會在后面的章節(jié)中討論其他類型的描述符,但基本過程是一樣的。假設我們有一個數(shù)據(jù),我們希望頂點著色器擁有一個這樣的C結(jié)構(gòu)體:

struct UniformBufferObject {
    glm::mat4 model;
    glm::mat4 view;
    glm::mat4 proj;
};

網(wǎng)友評論