操作系统: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 = ;
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 = ;

最后我们需要引用render pass和图形管线将要使用的子通道sub pass的索引。

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

实际上还有两个参数:basePipelineHandlebasePipelineIndex。Vulkan允许您通过已经存在的管线创建新的图形管线。这种衍生出新管线的想法在于,当要创建的管线与现有管道功能相同时,获得较低的开销,同时也可以更快的完成管线切换,当它们来自同一个父管线。可以通过basePipelineHandle指定现有管线的句柄,也可以引用由basePipelineIndex所以创建的另一个管线。目前只有一个管线,所以我们只需要指定一个空句柄和一个无效的索引。只有在VkGraphicsPipelineCreateInfoflags字段中也指定了VK_PIPELINE_CREATE_DERIVATIVE_BIT标志时,才需要使用这些值。

现在准备最后一步,创建一个类成员保存VkPipeline对象:

VkPipeline graphicsPipeline;

最后创建图形管线:

if (vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, , &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 地址。

Vulkan Tutorial 14 Integration pipeline的更多相关文章

  1. [译]Vulkan教程(14)图形管道基础之固定功能

    [译]Vulkan教程(14)图形管道基础之固定功能 Fixed functions 固定功能 The older graphics APIs provided default state for m ...

  2. Vulkan Tutorial 12 Fixed functions

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 早起的图形API在图形渲染管线的许多阶段提供了默认的状态.在Vulkan中,从vie ...

  3. Vulkan Tutorial 13 Render passes

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Setup 在我们完成管线的创建工作,我们接下来需要告诉Vulkan渲染时候使用的f ...

  4. Vulkan Tutorial 16 Command buffers

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 诸如绘制和内存操作相关命令,在Vulkan中不是通过函数直接调用的.我们需要在命令缓 ...

  5. Vulkan Tutorial 19 Vertex input description

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 在接下来几个章节中,我们将会使用内存顶点缓冲区来替换之前硬 ...

  6. Vulkan Tutorial 25 Images

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 到目前为止,几何图形使用每个顶点颜色进行着色处理,这是一个 ...

  7. Vulkan Tutorial 29 Loading models

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 应用程序现在已经可以渲染纹理3D模型,但是 vertice ...

  8. Vulkan Tutorial 开发环境搭建之Windows

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 相信很多人在开始学习Vulkan开发的起始阶段都会在开发环境的配置上下一些功夫,那么 ...

  9. Vulkan Tutorial 02 编写Vulkan应用程序框架原型

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 General structure 在上一节中,我们创建了一个正确配置.可运行的的V ...

随机推荐

  1. html运用以及工具

    对于这个教程,我建议你只使用最简单的工具.例如:Notepad(在windows里),TextEdit(在Mac上)或是KEdit(在KDE里)就可以了.一旦你了解这个原理,你就会想要切换到更高级的工 ...

  2. MVC 5 + EF6 完整教程16 -- 控制器详解

    Controller作为持久层和展现层的桥梁, 封装了应用程序的逻辑,是MVC中的核心组件之一. 本篇文章我们就来谈谈 Controller, 主要讨论两个方面: Controller运行机制简介 C ...

  3. xmlplus 组件设计系列之十 - 网格(DataGrid)

    这一章我们要实现是一个网格组件,该组件除了最基本的数据展示功能外,还提供排序以及数据过滤功能. 数据源 为了测试我们即将编写好网格组件,我们采用如下格式的数据源.此数据源包含两部分的内容,分别是表头数 ...

  4. iOS 制作自动打包脚本 Xcode8.3.2

    本文包含以下内容: 前言 1.shell脚本的编写 2.xcodebuild命令 3.完整的可用示例 参考资料 前言 做iOS开发,打包APP是比较频繁的事情,每次都手动去配置一堆东西确实是比较乏味. ...

  5. 使用openXML 不用插件导出excel

    注释很详细,不做解释了,有疑问可以提问 using System.IO; using System.Text; namespace iLIS.Common { /// <summary> ...

  6. Java 7之基础 - 强引用、弱引用、软引用、虚引用

    1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.如下: Object o=new Object();   //  强引用 当内 ...

  7. hdu1011 Starship Troopers 树形DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 思路:很明显的树形背包 定义dp[root][m]表示以root为根,派m个士兵的最优解,那么d ...

  8. 【SoDiaoEditor电子病历编辑器】阶段性更新--新增复选框、日期控件、表格排版支持等

    转眼距离上一次v2正式发布已经过去一个半月了.github期间不定期push了二十几次,同时感谢分布在广州.福建.上海.北京的一众小伙伴,正是你们给出的建议,才让SoDiaoEditor不断完善. 我 ...

  9. mac Ubuntu 设置快捷进入目录

    在我们实际工作中,好多时间需要经常性的进入某个目录查看文件等等之类的操作. 好多时候我们都是在终端一级一级的进入目录,相比较Windows的快捷方式有点繁琐. 废话少说,下面就是设置快捷方式的方法: ...

  10. java虚拟机学习-JVM调优总结-垃圾回收面临的问题(8)

    如何区分垃圾 上面说到的“引用计数”法,通过统计控制生成对象和删除对象时的引用数来判断.垃圾回收程序收集计数为0的对象即可.但是这种方法无法解决循环引用.所以,后来实现的垃圾判断算法中,都是从程序运行 ...