您的位置:首頁>正文

Vulkan Tutorial 14 Integration pipeline

作業系統:Windows8.1

顯卡:Nivida GTX965M

開發工具:Visual Studio 2017

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

Shader stages: 著色器模組定義了圖形管線可程式設計階段的功能Fixed-function state: 結構體定義固定管線功能, 比如輸入裝配、光柵化、viewport和color blendingPipeline 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

實際上還有兩個參數:basePipelineHandle和basePipelineIndex。 Vulkan允許您通過已經存在的管線創建新的圖形管線。 這種衍生出新管線的想法在於, 當要創建的管線與現有管道功能相同時, 獲得較低的開銷, 同時也可以更快的完成管線切換, 當它們來自同一個父管線。 可以通過basePipelineHandle指定現有管線的控制碼, 也可以引用由basePipelineIndex所以創建的另一個管線。 目前只有一個管線, 所以我們只需要指定一個空控制碼和一個無效的索引。 只有在VkGraphicsPipelineCreateInfo的flags欄位中也指定了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 位址。

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示