當前位置:
首頁 > 知識 > Vulkan Tutorial 14 Integration pipeline

Vulkan Tutorial 14 Integration pipeline

操作系統:Windows8.1

顯卡:Nivida GTX965M

開發工具:Visual Studio 2017

我們現在整合前幾章節的結構體和對象創建圖形管線!以下是我們現在用到的對象類型,作為一個快速回顧:

  • Shader stages: 著色器模塊定義了圖形管線可編程階段的功能
  • Fixed-function state: 結構體定義固定管線功能,比如輸入裝配、光柵化、viewport和color blending
  • Pipeline layout: 管線布局定義uniform 和 push values,被著色器每一次繪製的時候引用
  • Render pass: 渲染通道通過管線階段引用附件,並定義它的使用方式

所有這些決定了圖形管線的最終功能,所以我們在createGraphicsPipeline函數的最後填充VkGraphicsPipelineCreateInfo結構體。

VkGraphicsPipelineCreateInfo pipelineInfo = {};
pipelineInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
pipelineInfo.stageCount = 2;
pipelineInfo.pStages = shaderStages;

現在開始引用之前的VkPipelineShaderStageCreateInfo結構體數組。

pipelineInfo.pVertexInputState = &vertexInputInfo;
pipelineInfo.pInputAssemblyState = &inputAssembly;
pipelineInfo.pViewportState = &viewportState;
pipelineInfo.pRasterizationState = &rasterizer;
pipelineInfo.pMultisampleState = &multisampling;
pipelineInfo.pDepthStencilState = nullptr; // Optional
pipelineInfo.pColorBlendState = &colorBlending;
pipelineInfo.pDynamicState = nullptr; // Optional

並引用之前描述固定管線功能的結構體。

pipelineInfo.layout = pipelineLayout;

完成之後,pipeline layout管線布局,它是一個Vulkan句柄而不是結構體指針。

pipelineInfo.renderPass = renderPass;
pipelineInfo.subpass = 0;

最後我們需要引用render pass和圖形管線將要使用的子通道sub pass的索引。

pipelineInfo.basePipelineHandle = VK_NULL_HANDLE; // Optional
pipelineInfo.basePipelineIndex = -1; // Optional

實際上還有兩個參數:basePipelineHandlebasePipelineIndex。Vulkan允許您通過已經存在的管線創建新的圖形管線。這種衍生出新管線的想法在於,當要創建的管線與現有管道功能相同時,獲得較低的開銷,同時也可以更快的完成管線切換,當它們來自同一個父管線。可以通過basePipelineHandle指定現有管線的句柄,也可以引用由basePipelineIndex所以創建的另一個管線。目前只有一個管線,所以我們只需要指定一個空句柄和一個無效的索引。只有在VkGraphicsPipelineCreateInfoflags欄位中也指定了VK_PIPELINE_CREATE_DERIVATIVE_BIT標誌時,才需要使用這些值。

現在準備最後一步,創建一個類成員保存VkPipeline對象:

VkPipeline graphicsPipeline;

最後創建圖形管線:

if (vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &pipelineInfo, nullptr, &graphicsPipeline) != VK_SUCCESS) {
throw std::runtime_error("failed to create graphics pipeline!");
}

vkCreateGraphicsPipelines函數在Vulkan中比起一般的創建對象函數需要更多的參數。它可以用來傳遞多個VkGraphicsPipelineCreateInfo對象並創建多個VkPipeline對象。

我們傳遞VK_NULL_HANDLE參數作為第二個參數,作為可選VkPipelineCache對象的引用。流水線緩存可以用於存儲和復用與通過多次調用vkCreateGraphicsPipelines函數相關的數據,甚至在程序執行的時候緩存到一個文件中。這樣可以加速後續的管線創建邏輯。具體的內容我們會在管線緩存章節介紹。

圖形管線對於常見的繪圖操作是必須的,所以它也應該在程序結束時銷毀:

void cleanup {
vkDestroyPipeline(device, graphicsPipeline, nullptr);
vkDestroyPipelineLayout(device, pipelineLayout, nullptr);
...
}

現在運行程序,確認所有工作正常,並創建圖形管線成功!我們已經無比接近在屏幕上繪製出東西來了。在接下來的幾個章節中,我們將從交換鏈圖像中設置實際的幀緩衝區,並準備繪製命令。

項目代碼 GitHub地址。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 達人科技 的精彩文章:

Scrapy教程——博客園前3000名文章列表抓取
Ajax的用法總結
hibernate操作步驟(代碼部分)
最基礎的mybatis入門demo

TAG:達人科技 |

您可能感興趣

Rogue Swarm demo:將Vulkan和PowerVR Series8XE帶入我們的生活
Oculus Quest和Go現已支持Vulkan
Intel OpenCV庫支持Vulkan:獨立顯卡走來
Oculus Medium 2.0更新採用Vulkan新渲染引擎提高解析度
Vulkan即將推出macOS和iOS,但不會感謝Apple
[視頻]歌計劃在 Android P 中支持圖形 API Vulkan 1.1
新面孔Model】陳曦出鏡美國版《Vulkan Magazine》一月刊時尚大片
Flyme 7體驗版王者榮耀Vulkan來了 不過Pro 7除外
研發實戰:如何在Oculus Mobile VR平台進行Vulkan開發
AMD終止支持功勛API Mantle:曾催生DX12、Vulkan
Wine 3.3開發版發布:Bug修復 支持Vulkan!
Android Q將原生支持Vulkan,安卓手機和手游的春天?
Vulkan API終於登陸macOS/iOS平台 但與蘋果無關
Vulkan API 終於登陸 macOS、iOS,但與蘋果無關
《殭屍世界大戰》開啟Vulkan AMD Vega 64表現如何?
Android Q將支持Vulkan原生渲染引擎:流暢度/遊戲體驗大提升
Flyme 7體驗版11.13發布:支持王者榮耀Vulkan模式
Wine 3.3上線:首次支持Vulkan圖形介面 修復35處BUG
《殭屍世界大戰》開啟Vulkan:AMD Vega 64性能超了RTX 2080 Ti
Vulkan下RTX2080Ti竟沒法玩《殭屍世界大戰》?