Vulkan填坑學習Day09—圖形管線概述

Vulkan 圖形管線

此篇文章對一般計算機圖形管線講述個人感覺較好,可參考:圖形渲染管線簡介
Vulkan 圖形管線,通過接下來的章節,我們將會開啓有關圖形管線的話題,通過對圖形渲染管線的配置完成最後的三角形繪畫。所謂圖形管線就是將mesh使用到的vertices定點數據和貼圖數據,轉化爲渲染targets像素的操作序列。簡要的概述如下圖所示:
在這裏插入圖片描述

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

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

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

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

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

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

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

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

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

如果之前使用過舊的API(OpenGL和Direct3D),那麼將可以隨意通過glBlendFunc和OMSetBlendState調用更改管線設置。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官方的圖形管線結構圖,如下:
在這裏插入圖片描述

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