Vulkan填坑學習Day01 框架綜述

2021-10-01 21:24:29 字數 2742 閱讀 2411

以建立三角形為例(後續將逐步一一進行學習**更新):

1.例項和物理裝置選取;

2.邏輯裝置和佇列族;

3.視窗表面和交換鏈;

4.影象檢視和幀緩衝;

5.渲染通道;

6.圖形管線;

7.命令池和命令緩衝;

8.主迴圈渲染。

(1)步驟一:例項和物理裝置選取

第一步就是要建立vulkan例項,這也是vulkan應用程式的起始。通過描述你的應用程式和你將要使用什麼api擴充套件來建立例項,之後查詢vulkan支援的硬體並選擇乙個或多個vkphysicaldevice。

(2)步驟二:邏輯裝置和佇列族

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

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

第三步就是建立視窗和呈現渲染好的影象了。這需要兩個元件,乙個視窗表面(vksu***cekhr)和乙個交換鏈(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;

建立乙個渲染通道來指定渲染目標和用法;

為渲染通道建立幀緩衝;

建立圖形管線;

用繪製命令為每個可能的交換鏈影象分配和記錄命令緩衝;

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

學習筆記day01

作業系統簡稱 operating system 簡稱os 其的本質就是乙個軟體,作業系統對上可以管理應用程式,對下可以訪問硬體裝置。主流的作業系統 pc機領域 windows系列,ios,伺服器領域 linux系列,unix,windows server。手持裝置 ios,android,塞班,wi...

前端學習Day01

alt shift 1 非小鍵盤 視窗分屏,恢復預設1屏 alt shift 2 左右分屏 2列 alt shift 3 左右分屏 3列 alt shift 4 左右分屏 4列 alt shift 5 等分4屏 alt shift 8 垂直分屏 2屏 alt shift 9 垂直分屏 3屏 ctrl...

linux學習筆記day01

1 命令一般格式 命令 引數 目標 2 命令幫助 help whatis 可省略 可以新增多個 必須新增 3 常用命令 date,passwd,cal,gedit,cat,head,tail,wc,file,history 關機 poweroff shutdown h now init 0 重啟 r...