Vulkan Tutorial 10 圖形管線


操作系統:Windows8.1

顯卡:Nivida GTX965M

開發工具:Visual Studio 2017


Introduction

通過接下來的章節,我們將會開啟有關圖形管線的話題,通過對圖形渲染管線的配置完成最后的三角形繪畫。所謂圖形管線就是將mesh使用到的vertices定點數據和貼圖數據,轉化為渲染targets像素的操作序列。簡要的概述如下圖所示:

Input assembler收集最原始的頂點數據,並且還可以使用索引緩沖區復用這些數據元素,而不必復制冗余的頂點數據副本。

 

vertex shader會應用在每一個頂點數據,通常應用變換操作,從而將頂點的位置坐標數據從模型空間轉換為屏幕空間。在處理完畢之后會將數據繼續在管線傳遞下去。

 

tessellation shader曲面着色器允許基於某些規則進一步細分幾何數據增加網格的質量。經常應用與牆面和樓梯表面,使附近看起來不是那么平坦。

 

geometry shader集合着色器應用在每一個圖元上,可用於增減圖元,它與曲面着色器類似,但更加靈活。然而,它在今天的應用中並沒有太多的應用情景,因為除了Intel的集成顯卡外,大多數顯卡性能支持都不理想。

 

光柵化階段將圖元分解為片元。這些是填充在幀緩沖區上的像素元素。屏幕外區域的片元會被丟棄,頂點着色器輸出的數據在傳遞到片元着色器的過程中會進行內插值,如圖所示。除此之外,根據深度測試的結果也會對片元進行丟棄。

 

fragment shader應用於每個片元,確定每個幀緩沖區中寫入的片元數據的顏色和深度值。片元着色器可以使用頂點着色器的插值數據,貼圖的UV坐標和光源法線數據。

 

混色操作階段會對不同片元的顏色進行混合,最終映射到幀緩沖區的同一個像素上。片元也可以簡單的互相重寫,疊加或者根據透明度混合。

 

綠色的階段被稱為固定流水線。這個階段允許使用自定義的參數數值,但是它內部的工作邏輯是預制好的。

 

橙色的階段被稱為可編程階段programmable,我們可以向GPU提交自己編寫的代碼執行具體的邏輯。比如在使用fragment shader的時候,可以實現任何從貼圖到燈光的光線追蹤。這些程序同時運行在多核GPU上處理許多對象,比如並行的頂點和片段程序。

 

如果之前使用過舊的API(OpenGL和Direct3D),那么將可以隨意通過glBlendFuncOMSetBlendState調用更改管線設置。Vulkan中的圖形管線幾乎不可改變,因此如果需要更改着色器,綁定到不同的幀緩沖區或者更改混合函數,則必須從頭創建管線。缺點是必須創建一些管線,這些管線代表在渲染操作中使用的不同的組合狀態。但是由於所有管線的操作都是提前知道的,所以可以通過驅動程序更好的優化它。

 

一些可編程階段是基於打算做什么而決定的。比如,如果只是簡單的繪制幾何圖形,則可以禁用tessellation和geometry着色器。如果只對深度值感興趣,則可以禁用fragment着色器,這對於生成shadow map生成很有用。

 

在下一個章節中,我們首先創建將三角形放在屏幕上所需要的兩個可編程階段:vertice shader和fragment shader。固定功能的設置包括blending mode, viewport, rasterization將在之后的章節中設置。在Vulkan中設置圖形流水線的最后一部分內容涉及輸入和輸出幀緩沖區。

 

initVulkan中創建函數createGraphicsPipeline並在createImageViews后立即調用。我們在下一章節介紹函數功能。

void initVulkan() {
    createInstance();
    setupDebugCallback();
    createSurface();
    pickPhysicalDevice();
    createLogicalDevice();
    createSwapChain();
    createImageViews();
    createGraphicsPipeline();
}

...

void createGraphicsPipeline() {

}

在結尾處分享一下Vulkan官方的圖形管線結構圖,如下:

 

項目代碼 GitHub 地址。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM