Vulkan Tutorial 9 描述符集合

2021-09-10 07:50:06 字數 2486 閱讀 3256

在上一節定義了乙個描述符集合布局,但是並沒有實際建立。描述符集合用於告訴gpu,uniform buffer是如何對映到著色器程式的uniform變數。本節介紹描述符集合的建立和初始化。

與明亮緩衝類似,描述符集合也是衝池裡面建立的,所以必須先建立乙個池。對於乙個uniform buffer,只需要乙個描述符集合,因此建立乙個池非常簡單:

vkdescriptorpoolsize type_count[1];

type_count[0].type = vk_descriptor_type_uniform_buffer;

type_count[0].descriptorcount = 1;

vkdescriptorpoolcreateinfo descriptor_pool = {};

descriptor_pool.stype = vk_structure_type_descriptor_pool_create_info;

descriptor_pool.pnext = null;

descriptor_pool.maxsets = 1;

descriptor_pool.poolsizecount = 1;

descriptor_pool.ppoolsizes = type_count;

res = vkcreatedescriptorpool(info.device, &descriptor_pool, null, &info.desc_pool);

要建立乙個描述符集合,必須提供描述符集合的布局,在上一節有講過。布局用於描述如何建立描述符集合。

vkdescriptorsetallocateinfo alloc_info[1];

alloc_info[0].stype = vk_structure_type_descriptor_set_allocate_info;

alloc_info[0].pnext = null;

alloc_info[0].descriptorpool = info.desc_pool;

alloc_info[0].descriptorsetcount = num_descriptor_sets;

alloc_info[0].psetlayouts = info.desc_layout.data();

info.desc_set.resize(num_descriptor_sets);

res = vkallocatedescriptorsets(info.device, alloc_info, info.desc_set.data());

注意,此時還沒有真正地在任何地方使用uniform緩衝區的控制代碼。建立uniform緩衝區時,將uniform緩衝區的資訊儲存在vkdescriptorbufferinfo結構體中,結構體變數名為info.uniform_data.buffer_info。可以在init_uniform_buffer()裡面看到info.uniform_data.buffer_info是如何被初始化的。

info.uniform_data.buffer_info宣告如下:

typedef struct vkdescriptorbufferinfo  vkdescriptorbufferinfo;
buffer是uniform buffer的控制代碼。

vkwritedescriptorset writes[1];

writes[0] = {};

writes[0].stype = vk_structure_type_write_descriptor_set;

writes[0].pnext = null;

writes[0].dstset = info.desc_set[0];

writes[0].descriptorcount = 1;

writes[0].descriptortype = vk_descriptor_type_uniform_buffer;

writes[0].pbufferinfo = &info.uniform_data.buffer_info;

writes[0].dstarrayelement = 0;

writes[0].dstbinding = 0;

vkupdatedescriptorsets(info.device, 1, writes, 0, null);

上面的步驟實際上是將vkdescriptorbufferinfo複製到描述符,描述符在裝置記憶體中。

這個緩衝區資訊包括對uniform 緩衝區的控制代碼,以及在uniform 緩衝區中訪問的資料的偏移量和大小。此處,uniform buffer僅僅包含mvp變換,所以offset是0,size是mvp的大小,這是由info.uniform_data.buffer_info中的管道布局示例設定的。

描述符的精確的位元組布局可能是特定於實現的,因此對上層來說是不透明的。這就是為什麼使用vulkan驅動函式來操作描述符,而不是自己對映和編寫它們。

Vulkan Tutorial 4 建立命令緩衝區

基本命令緩衝區操作 opengl裡面設定線寬的時候,是通過呼叫gllinewidth 如下圖所示,驅動程式將這個api呼叫轉換為特定於gpu的指令,並且放入命令緩衝區。驅動程式負責管理這個緩衝區的建立和銷毀,並且負責將命令緩衝傳送給gpu去處理緩衝裡面指令,應用程式不需要關心這些操作。在vulkan...

9月9號作業

優點 敲完一條命令,馬上就能看到結果 缺點 無法儲存優點 能以檔案的形式儲存 缺點 檔案永久儲存在硬碟中,並且開啟檔案後,會讀一行翻譯一行當沒有變數名指向變數值時,會消除變數值存在記憶體中的儲存空間 x 10 y 10 z 10 del y10的引用計數為多少?引用計數 2個x 257 y x de...

9 個 笑 話 9 個 道 理

1 建築師 一位夫人打 給建築師,說每當火車經過時,她的睡床就會搖動。這簡直是無稽之談1建築師回答說,我來看看。建築師到達後,夫人建議他躺在床上,體會一下火車經過時的感覺。建築師剛 躺下,夫人的丈夫就回來了。他見此情形,便厲聲喝問 你躺在我妻子的床上幹什麼?建築師戰戰兢兢地回答 我說是在等火車,你會...