1. 程式人生 > >Vulkan Cookbook 第四章 9 建立2D影象和檢視

Vulkan Cookbook 第四章 9 建立2D影象和檢視

建立2D影象和檢視

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

在許多流行的應用程式或遊戲中使用的最常見影象型別是具有RGBA四個組建和每個紋素32位的典型2D紋理。要在Vulkan中建立這樣的資源,我們需要建立一個2D影象和一個適合的影象檢視。

怎麼做...

1.獲取邏輯裝置控制代碼並使用它來初始化名為logical_device的VkDevice型別變數。
2.選擇影象中使用的資料格式,並使用所選值初始化名為format的VkFormat型別變數。
3.選擇影象的大小。將其儲存在名為size的VkExtent2D型別的變數中。
4.選擇應構成影象的mipmap級別數量,初始化名為num_mipmaps的uint32_t型別變數。
5.使用名為num_layers的uint32_t型別變數指定影象層數量。
6.選擇紋素樣本的數量並將其儲存在名為samples的VkSampleCountFlagBits型別變數中。
7.想一想影象將在應用程式中使用的所有目的。將所有這些用法的邏輯和(or)值儲存在名為usage的VkImageUsageFlags型別變數中。
8.使用logical_device、format、size、num_mipmaps、num_layers、samples和usage變數建立VK_IMAGE_TYPE_2D型別的映像。將建立的影象控制代碼儲存在名為image的VkImage型別變數中(請參閱

建立影象內容)。
9.獲取從中獲取logical_device控制代碼的物理裝置控制代碼。將物理裝置控制代碼儲存在名為physical_device的VkPhysicalDevice型別變數中。
10.獲取physical_device的記憶體屬性並使用它們來分配將繫結到image變數的影象記憶體物件。確保使用具有VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT屬性的記憶體型別。將分配的記憶體物件儲存在名為memory_object的VkDeviceMemory型別變數中(請參閱分配記憶體物件和將其繫結到影象)。
11.選擇用於影象檢視建立的影象方面(顏色或深度和/或模板)並將其儲存在名為aspect的VkImageAspectFlags型別變數中。
12.建立VK_IMAGE_VIEW_TYPE_2D型別的影象檢視。在建立影象檢視期間使用logical_device,image,format和aspect變臉。將建立的控制代碼儲存在名為image_view的VkImageView型別變數中(請參閱
建立影象檢視
內容)。

這個怎麼運作...

影象建立要求我們執行三個一般步驟:
    1.建立一個影象。
    2.建立一個記憶體物件(或使用現有物件)並將其繫結到影象。
    3.建立影象檢視。

對於通常用作紋理的影象,我們需要建立VK_IMAGE_TYPE_2D型別的影象格式VK_FORMAT_R8G8B8A8_UNORM,但我們可以根據需求設定這些引數。影象的其餘部分取決於影象的大小(換句話說,我們是從現有影象檔案建立紋理,需要匹配影象檔案的尺寸),應該應用於影象的過濾型別(如果我們想要使用mipmapping),樣本數量(如果應該進行多重取樣),以及所需的使用場景。

影象建立可以簡化為以下程式碼:

if( !CreateImage( logical_device, type, format, { size.width, size.height, 1 }, 1, 1, VK_SAMPLE_COUNT_1_BIT, usage | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, false, input_attachment ) ) {
      return false;
}

接下來,我們需要分配記憶體物件並將其繫結到影象,如分配記憶體物件和將其繫結到影象內容中所述。為了獲得最佳效能,應該在快速的裝置本地記憶體上分配記憶體物件,如下所示。

if( !AllocateAndBindMemoryObjectToImage( physical_device, logical_device, input_attachment, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, memory_object ) ) {
      return false;
}

我們當然可以使用現有的記憶體物件,如果它滿足影象的記憶體要求並且有足夠的儲存空間。

之後,必須建立一個影象檢視。有了它我們可以告訴硬體如何解釋影象資料。還可以為檢視使用不同(但仍然相容)的格式。但是對於許多(如果不是大多數)目的沒有這個必要,我們將指定與影象相同的格式。對於標準2D紋理,我們還使用顏色方面來建立檢視,但對於具有深度資料的影象(換句話說,對於用作深度附件的影象)必須指定深度方面。有關影象檢視建立的更多詳細資訊,請按照建立影象的內容:

if( !CreateImageView( logical_device, image, VK_IMAGE_VIEW_TYPE_2D, format, aspect, image_view ) ) { 
  return false; 
}

現在,影象已準備好在我們的應用程式中使用。我們可以將資料從檔案上傳到影象,並將其用作著色器內的紋理(在這種情況下,我們還需要一個取樣器和描述符集)。還可以將影象的檢視繫結到幀緩衝區,並將其用作顏色附件(渲染目標)。