Vulkan Tutorial 14 Integration pipeline
操作系統(tǒng):Windows8.1
顯卡:Nivida GTX965M
開發(fā)工具:Visual Studio 2017
我們現(xiàn)在整合前幾章節(jié)的結(jié)構(gòu)體和對象創(chuàng)建圖形管線!以下是我們現(xiàn)在用到的對象類型,作為一個快速回顧:
- Shader stages: 著色器模塊定義了圖形管線可編程階段的功能
- Fixed-function state: 結(jié)構(gòu)體定義固定管線功能,比如輸入裝配、光柵化、viewport和color blending
- Pipeline layout: 管線布局定義uniform 和 push values,被著色器每一次繪制的時候引用
- Render pass: 渲染通道通過管線階段引用附件,并定義它的使用方式
所有這些決定了圖形管線的最終功能,所以我們在createGraphicsPipeline函數(shù)的最后填充VkGraphicsPipelineCreateInfo結(jié)構(gòu)體。
VkGraphicsPipelineCreateInfo pipelineInfo = {}; pipelineInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; pipelineInfo.stageCount = 2; pipelineInfo.pStages = shaderStages;現(xiàn)在開始引用之前的VkPipelineShaderStageCreateInfo結(jié)構(gòu)體數(shù)組。
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并引用之前描述固定管線功能的結(jié)構(gòu)體。
pipelineInfo.layout = pipelineLayout;完成之后,pipeline layout管線布局,它是一個Vulkan句柄而不是結(jié)構(gòu)體指針。
pipelineInfo.renderPass = renderPass; pipelineInfo.subpass = 0;最后我們需要引用render pass和圖形管線將要使用的子通道sub pass的索引。
pipelineInfo.basePipelineHandle = VK_NULL_HANDLE; // Optional pipelineInfo.basePipelineIndex = -1; // Optional實際上還有兩個參數(shù):basePipelineHandle 和 basePipelineIndex。Vulkan允許您通過已經(jīng)存在的管線創(chuàng)建新的圖形管線。這種衍生出新管線的想法在于,當(dāng)要創(chuàng)建的管線與現(xiàn)有管道功能相同時,獲得較低的開銷,同時也可以更快的完成管線切換,當(dāng)它們來自同一個父管線??梢酝ㄟ^basePipelineHandle指定現(xiàn)有管線的句柄,也可以引用由basePipelineIndex所以創(chuàng)建的另一個管線。目前只有一個管線,所以我們只需要指定一個空句柄和一個無效的索引。只有在VkGraphicsPipelineCreateInfo的flags字段中也指定了VK_PIPELINE_CREATE_DERIVATIVE_BIT標(biāo)志時,才需要使用這些值。
?
現(xiàn)在準(zhǔn)備最后一步,創(chuàng)建一個類成員保存VkPipeline對象:
VkPipeline graphicsPipeline;最后創(chuàng)建圖形管線:
if (vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &pipelineInfo, nullptr, &graphicsPipeline) != VK_SUCCESS) {throw std::runtime_error("failed to create graphics pipeline!"); }vkCreateGraphicsPipelines函數(shù)在Vulkan中比起一般的創(chuàng)建對象函數(shù)需要更多的參數(shù)。它可以用來傳遞多個VkGraphicsPipelineCreateInfo對象并創(chuàng)建多個VkPipeline對象。
?
我們傳遞VK_NULL_HANDLE參數(shù)作為第二個參數(shù),作為可選VkPipelineCache對象的引用。管線緩存可以用于存儲和復(fù)用與通過多次調(diào)用vkCreateGraphicsPipelines函數(shù)相關(guān)的數(shù)據(jù),甚至在程序執(zhí)行的時候緩存到一個文件中。這樣可以加速后續(xù)的管線創(chuàng)建邏輯。具體的內(nèi)容我們會在管線緩存章節(jié)介紹。
?
圖形管線對于常見的繪圖操作是必須的,所以它也應(yīng)該在程序結(jié)束時銷毀:
void cleanup() {vkDestroyPipeline(device, graphicsPipeline, nullptr);vkDestroyPipelineLayout(device, pipelineLayout, nullptr);... }現(xiàn)在運(yùn)行程序,確認(rèn)所有工作正常,并創(chuàng)建圖形管線成功!我們已經(jīng)無比接近在屏幕上繪制出東西來了。在接下來的幾個章節(jié)中,我們將從交換鏈圖像中設(shè)置實際的幀緩沖區(qū),并準(zhǔn)備繪制命令。
?
項目代碼 GitHub?地址。
轉(zhuǎn)載于:https://www.cnblogs.com/heitao/p/6987319.html
總結(jié)
以上是生活随笔為你收集整理的Vulkan Tutorial 14 Integration pipeline的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【bzoj2154】Crash的数字表格
- 下一篇: bootstrap-实现loading效