1. 程式人生 > >Vulkan Cookbook 第五章 8 建立儲存緩衝區

Vulkan Cookbook 第五章 8 建立儲存緩衝區

建立儲存緩衝區

譯者注:示例程式碼點選此處

當我們不僅想從著色器中的緩衝區中讀取資料,而且想在其中儲存資料時,需要使用儲存緩衝區。這些是使用VK_BUFFER_USAGE_STORAGE_BUFFER_BIT建立的。

怎麼做...

  1. 獲取物理裝置控制代碼並存儲在名為physical_device的VkPhysicalDevice變數中。
  2. 建立一個名為storage_buffer的VkBuffer型別變數我們將在其中儲存建立的儲存緩衝區控制代碼。
  3. 使用logical_device變數建立所需大小和用法的緩衝區。指定用法必須包含一個VK_BUFFER_USAGE_STORAGE_BUFFER_BIT標誌。將建立的控制代碼儲存在storage_buffer變數中(請參閱第四章,資源和記憶體中的
    建立緩衝區
    內容)。
  4. 使用VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT屬性分配記憶體物件(或使用現有記憶體物件的部分範圍)並將其繫結到建立的緩衝區(請參閱第4章,資源和記憶體中的為緩衝區分配和繫結記憶體物件內容)。

這個怎麼運作...

儲存緩衝區支援讀寫操作。我們還可以對具有無符號整數格式的儲存緩衝區成員執行原子操作。

提示:儲存緩衝區對應於VK_DESCRIPTOR_TYPE_STORAGE_BUFFER或VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC描述符型別。

儲存緩衝區成員的資料必須放在適當的偏移量處。滿足要求的最簡單方法是遵從GLSL語言中的std430佈局規則。儲存緩衝區的基本對齊規則類似於統一緩衝區的規則。但是陣列和結構體除外-它們的偏移量不需要四捨五入到16的倍數。為方便起見,這些規則指定如下:

  • 大小為N的標量變數必須放置在N的倍數的偏移處
  • 具有兩個分量的向量,其中每個分量的大小為N,必須放置在2N的倍數的偏移處
  • 具有三個或四個分量的向量,其中每個分量的大小為N,必須放置在4N倍數的偏移處
  • 具有大小為N的元素的陣列必須放置在N的倍數的偏移處
  • 結構體的偏移處,必須被放置在其任何成員(具有最大偏移量需求的成員)的最大偏移量的倍數處 。
  • 行主序矩陣必須放置在等於向量偏移量的偏移處,其中分量數等於矩陣中的列數。
  • 列主序矩陣必須放置在與其列相同的偏移處

動態儲存緩衝區(Dynamic storage buffers)與普通儲存緩衝區的基礎記憶體偏移的定義方式不同。在描述符更新期間指定的偏移量和範圍對於普通儲存緩衝區保持不變,直到下一次更新,在其動態變化的情況下,指定偏移量變為基礎地址,稍後可以通過在描述符集繫結到命令緩衝區時新增的動態偏移量來修改基偏移。

提示:在GLSL著色器中,儲存緩衝區和動態儲存緩衝區的定義於緩衝區限定符和語法塊相同。

GLSL著色器中使用的儲存緩衝區示例如下:


layout (set=m, binding=n) buffer <variable name> {
  vec4 <member 1 name>; 
  mat4 <member 2 name>; 
  // ...
};