Vulkan填坑學習Day01—框架綜述

Vulkan教程代碼框架

一、環境搭建

主要是Windows上,下載Vulkan SDK,下載GLFW(Graphics Library Framework),下載GLM(OpenGL Mathematics),配置VS,驗證Vulkan擴展。

二、目標及步驟

以創建三角形爲例(後續將逐步一一進行學習代碼更新):

1.實例和物理設備選取;
2.邏輯設備和隊列族;
3.窗口表面和交換鏈;
4.圖像視圖和幀緩衝;
5.渲染通道;
6.圖形管線;
7.命令池和命令緩衝;
8.主循環渲染。

三、具體步驟解析

(1)步驟一:實例和物理設備選取

第一步就是要建立Vulkan實例,這也是Vulkan應用程序的起始。通過描述你的應用程序和你將要使用什麼API擴展來創建實例,之後查詢Vulkan支持的硬件並選擇一個或多個VkPhysicalDevice。

(2)步驟二:邏輯設備和隊列族

第二步就要傳將邏輯設備VkDevice了,此時你要更詳細描述你需要使用哪些VkPhysicalDevice特性,比如多視口渲染和64位浮點數等。還要指定使用哪些隊列族。大多數的Vulkan操作,如繪製命令和內存操作,都是提交到VkQueue中異步執行的。隊列是從隊列族中分配出來的,每個隊列族支持一組特定操作。例如,圖形、計算和內存轉移操作可能有着單獨的隊列族。隊列族的可用性也可以用作物理設備選取的一個顯著因素。可能一個支持Vulkan的設備卻不提供圖形功能,但是當前階段的顯卡支持Vulkan的都基本支持了我們所需的隊列操作。

(3)步驟三:窗口表面和交換鏈

第三步就是創建窗口和呈現渲染好的圖像了。這需要兩個組件,一個窗口表面(VkSurfaceKHR)和一個交換鏈(VkSwapchainKHR)。KHR後綴表示這些對象是Vulkan擴展的一部分。Vulkan API本身是跨平臺的,表面則是要渲染到的窗口的跨平臺抽象,通常用一個原生窗口句柄引用來實例化,例如Windows平臺上就是HWND。

交換鏈就是一批渲染目標,它的基本目的就是保證我們當前渲染的圖像和已經在屏幕上的那個是不一樣的。保證只顯示完整圖像時很重要的,每次我們想要繪製一幀的時候都要向交換鏈請求提供一個圖像。當我我們完成一幀的繪製後就將圖像返回給交換鏈以便它在某個時候呈現到屏幕上。渲染目標個數以及將完成的圖像呈現到屏幕上所需的條件依賴於呈現模式。常見的呈現模式有雙緩衝(垂直同步)和三緩衝。

(4)步驟四:圖像視圖和幀緩衝

第四步,爲了繪製從交換鏈獲取的圖像,將它包裝成VkImageView和VkFramebuffer。圖像視圖引用了要用的圖像的某個特殊部分,幀緩衝引用了用於顏色、深度和模板目標的圖像視圖。因爲交換鏈中可能有很多不同圖像,我們預先爲每個圖像創建一個圖像視圖和一個幀緩衝,然後在繪製的時候選擇正確的那個。

(5)步驟五:渲染通道

第五步,Vulkan的渲染通道描述了渲染操作中用的圖像的類型,以及如何使用它們,如何對待其內容。對於這個教程的三角形程序來說,我們就告訴Vulkan我們將使用單個圖像作爲顏色對象,且要在繪製操作之前被清空爲一個純色。然而渲染通道只描述了圖像類型,VkFramebuffer實際上會向這些槽綁定特定的圖像。

(6)步驟六:圖形管線

第六步,Vulkan的圖形管線通過創建一個VkPipeline對象來建立,它描述了顯卡的可配置狀態,比如視口大小和深度緩衝操作以及使用VkShaderModule對象時的可編程狀態。VkShaderModule對象是從着色器代碼創建的,我們會通過引用渲染通道指定。

Vulkan和現有API相比最顯著的特性是它的所有圖形管線配置都要提前設置。這意味着如果你想要切換到一個不同的着色器,或者稍微改變頂點佈局,你都要完全重建圖形管線。這也意味着你要爲所有你想要的渲染操作的不同組合提前建立許多VkPipeline對象。只有一些基礎配置,如視口大小和顏色清除等可以動態改變。所有的狀態都要明確描述,比如,連默認顏色混合狀態都沒有。

好消息是,因爲你相當於在做提前編譯而不是即時編譯,驅動就會有更多的優化機會,運行時也更容易得到可預測的表現,因爲像切換到不同圖形管線這也的大型狀態改變都是明確設定好的。

(7)步驟七:命令池和命令緩衝

第七步,命令池和命令緩衝。就和之前提到的一樣,Vulkan中許多的操作像繪製命令等都要提交到一個隊列中。這些操作首先需要記錄到VkCommandBuffer,然後才能提交。這些命令緩衝是從VkCommandPool分配的,VkCommandPool又和一個特定隊列族相關聯。爲了繪製一個簡單的三角形,我們要用如下操作來記錄一個命令緩衝:

開始渲染通道;
綁定圖形管線;
繪製三個頂點;
結束渲染通道。

因爲幀緩衝中的圖像依賴於交換鏈到底給我們哪一個圖像,我們要爲每個可能的圖像記錄命令緩衝並在繪製的時候選擇正確的那個。

(8)步驟八:主循環渲染

第八步就是主循環了。現在繪製命令已經包裝成一個命令緩衝,主循環就比較直白了。首先用vkAcquireNextImageKHR從交換鏈獲取圖像,然後爲該圖像選擇合適的命令緩衝,用vkQueueSubmit執行。最終,返回圖像到交換鏈以便用vkQueuePresentKHR呈現到屏幕。

提交到隊列的操作是異步執行的,因此我們必須用類似信號量的同步對象來確保正確的執行順序。繪製命令緩衝的執行一定要等待圖像獲取完成,否則可能會在渲染的時候用了一個還在讀取用於展示到屏幕上的圖像。vkQueuePresentKHR調用需要等待渲染完成,要使用第二個信號量來標記渲染完成。

四、小結

繪製一個三角形要做的工作如下:

創建一個VkInstance;

選擇一個支持的顯卡(VkPhysicalDevice);

創建一個VkDevice和一個VkQueue來繪製和呈現;

創建一個窗口,窗口表面和交換鏈;

將交換鏈圖像包裝到VkImageView;

創建一個渲染通道來指定渲染目標和用法;

爲渲染通道創建幀緩衝;

建立圖形管線;

用繪製命令爲每個可能的交換鏈圖像分配和記錄命令緩衝;

通過獲取圖像來繪製幀,提交正確的繪製命令緩衝並返回圖像到交換鏈。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章