操作系統: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),那么將可以隨意通過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官方的圖形管線結構圖,如下:
項目代碼 GitHub 地址。