目录

  • Input Attachments
    • prepare
    • render
    • 小结
  • Sub Passes
    • prepare
    • render
    • 小结
  • Offscreen Renderings
    • prepare
    • render
    • 小结

Input Attachments

prepare

  • loadAssets: 加载模型
  • prepareUniformBuffers
    • updateUniformBuffers
  • setupRenderPass: 重写了父类的方法, 创建 Attachment
    • 创建的数量是: swapChain.imageCount

    • 每个 Attachment 都需要创建 color 和 depth 附件

      • VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
      • VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
    • 初始化每个 Attachment 的参数

    • 创建subpass: std::array<VkSubpassDescription,2> subpassDescriptions

      • VkAttachmentReference
      • 创建一个给 Attachment 填充颜色和深度的subpass
      • 创建一个swap chain 填充颜色的 subpass
      • 再创建两个引用 VkAttachmentReference inputReferences
        • 将 fragment shader 中的输出写入Attachment : InputAttachments
      • swap chain 的subpass 中引入 InputAttachments, 填充颜色
    • 创建 VkSubpassDependency

        dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL;dependencies[0].dstSubpass = 0;//源为管线dependencies[0].srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;//输出到 color attachment 中dependencies[0].dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;//读取方式dependencies[0].srcAccessMask = VK_ACCESS_MEMORY_READ_BIT;dependencies[0].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;dependencies[0].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;// This dependency transitions the input attachment from color attachment to shader readdependencies[1].srcSubpass = 0;dependencies[1].dstSubpass = 1;//源为 color attachmentdependencies[1].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;//输出到 fragment shader 中dependencies[1].dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;dependencies[1].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;//读取方式dependencies[1].dstAccessMask = VK_ACCESS_SHADER_READ_BIT;dependencies[1].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;dependencies[2].srcSubpass = 0;dependencies[2].dstSubpass = VK_SUBPASS_EXTERNAL;//源为 color attachment dependencies[2].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;// 输出到管线中dependencies[2].dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;dependencies[2].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;dependencies[2].dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;dependencies[2].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
      
    • vkCreateRenderPass

  • setupDescriptors
    • 创建3个pool

      • VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER
      • VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER
      • VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT
    • Attachment write
      • vkCreateDescriptorSetLayout
      • vkCreatePipelineLayout
      • vkAllocateDescriptorSets
      • vkUpdateDescriptorSets
    • Attachment read
      • descriptorSetLayoutBinding: 三个

        • VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: 颜色
        • VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: 深度
        • VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER
      • vkCreateDescriptorSetLayout
      • vkCreatePipelineLayout
      • vkAllocateDescriptorSets
      • vkUpdateDescriptorSets
  • preparePipelines: attachment 需创建两个pipeline, 一个写 Attachment, 一个读 attachment
    • VkGraphicsPipelineCreateInfo: 多出了为Attachment配置的代码

      • pipelineCI.renderPass = renderPass;
      • Attachment write
        • pipelineCI.subpass = 0;
        • pipelineCI.layout = pipelineLayouts.attachmentWrite;
      • vkCreateGraphicsPipelines
      • Attachment read
        • pipelineCI.subpass = 1
        • pipelineCI.layout = pipelineLayouts.attachmentRead;
      • vkCreateGraphicsPipelines
  • buildCommandBuffers: 分别为两个 subpass 创建 CommandBuffer
        /*First sub passFills the attachments*/{vks::debugmarker::beginRegion(drawCmdBuffers[i], "Subpass 0: Writing attachments", glm::vec4(1.0f, 1.0f, 1.0f, 1.0f));vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.attachmentWrite);vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayouts.attachmentWrite, 0, 1, &descriptorSets.attachmentWrite, 0, NULL);scene.draw(drawCmdBuffers[i]);vks::debugmarker::endRegion(drawCmdBuffers[i]);}/*Second sub passRender a full screen quad, reading from the previously written attachments via input attachments*/{vks::debugmarker::beginRegion(drawCmdBuffers[i], "Subpass 1: Reading attachments", glm::vec4(1.0f, 1.0f, 1.0f, 1.0f));vkCmdNextSubpass(drawCmdBuffers[i], VK_SUBPASS_CONTENTS_INLINE);vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.attachmentRead);vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayouts.attachmentRead, 0, 1, &descriptorSets.attachmentRead[i], 0, NULL);vkCmdDraw(drawCmdBuffers[i], 3, 1, 0, 0);vks::debugmarker::endRegion(drawCmdBuffers[i]);}

render

  • draw
  • updateUniformBuffers

小结

   本节主要讲怎样使用 Attachments 进行渲染. 但是我觉得这里的重点是怎样使用subpass进行渲染.

Sub Passes

prepare

  • loadAssets: 加载模型和纹理
  • initLights: 设置光源
  • prepareUniformBuffers
    • updateUniformBufferDeferredMatrices
    • updateUniformBufferDeferredLights
  • setupFrameBuffer: 重写父类方法
    • 当屏幕大小发生遍布重写设置Gbuffer: createGBufferAttachments
    • writeDescriptorSets
    • vkUpdateDescriptorSets
    • 正向渲染
    • writeDescriptorSets
    • vkUpdateDescriptorSets
    • vkCreateFramebuffer
  • setupRenderPass: 重写父类方法
    • createGBufferAttachments: 创建Gbuffer

      • createAttachment – position
      • createAttachment – normal
      • createAttachment – albedo
    • VkAttachmentDescription: 有5个, 与上一节相似,主要设置,怎么写入gbuffer,怎么从gbuffer读数据
    • vkCreateRenderPass
  • setupDescriptorSetLayout
    • vkCreateDescriptorSetLayout
    • vkCreatePipelineLayout
  • preparePipelines: 中增加了 blendAttachmentStates
    • colorBlendState.attachmentCount = static_cast<uint32_t>(blendAttachmentStates.size());
    • colorBlendState.pAttachments = blendAttachmentStates.data();
  • setupDescriptorPool
    • 创建3个pool

      • VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER
      • VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER
      • VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT
  • setupDescriptorSet
    • vkAllocateDescriptorSets
    • writeDescriptorSets
  • prepareCompositionPass:
    • Descriptor set layout

      • descriptorSetLayoutBinding

        • Position input attachment
        • Normal input attachment
        • Albedo input attachment
        • Light positions
          -vkCreateDescriptorSetLayout
    • Pipeline layout
      • vkCreatePipelineLayout
    • Descriptor sets
      • vkAllocateDescriptorSets
      • writeDescriptorSets
        • writeDescriptorSet

          • Position texture target
          • Normals texture target
          • Albedo texture target
          • Fragment shader lights
            -vkUpdateDescriptorSets
    • Pipeline
      • pipelineCreateInfo
      • vkCreateGraphicsPipelines
    • Transparent (forward) pipeline
      • vkCreateDescriptorSetLayout
      • vkCreatePipelineLayout
      • vkAllocateDescriptorSets
      • vkUpdateDescriptorSets
      • vkCreateGraphicsPipelines
  • buildCommandBuffers: subpass有3个
    • 第一个将场景数据写入Gbuffer
    • 第二个用gbuffer数据渲染到attachment中
    • 第三个正向渲染

render

  • draw
  • updateUniformBufferDeferredMatrices
  • updateUniformBufferDeferredLights

小结

   本节主要讲延迟渲染的方法. 总体来说就是更详细介绍了subpass的使用方法.

Offscreen Renderings

prepare

  • loadAssets: 加载模型
  • prepareOffscreen: 准备离屏渲染资源
    • 准备的资源如下
       struct OffscreenPass {int32_t width, height;VkFramebuffer frameBuffer;FrameBufferAttachment color, depth;VkRenderPass renderPass;VkSampler sampler;VkDescriptorImageInfo descriptor;} offscreenPass;
    
    • vkCreateImage(color)
    • vkGetImageMemoryRequirements
    • vkAllocateMemory
    • vkBindImageMemory
    • vkCreateImageView
    • vkCreateSampler
    • vkCreateImage(depth)
    • vkGetImageMemoryRequirements
    • vkAllocateMemory
    • vkBindImageMemory
    • vkCreateImageView
    • attchmentDescriptions: 分别为color和depth
    • subpassDescription: 附加Attachment引用
    • vkCreateRenderPass
    • vkCreateFramebuffer: 将渲染后的资源写入 frame buffer
  • prepareUniformBuffers
    • updateUniformBuffers
    • updateUniformBufferOffscreen: 离屏pass更新uniform
  • setupDescriptorSetLayout
    • vkCreateDescriptorSetLayout
    • vkCreatePipelineLayout
  • preparePipelines: 新建四个pipelines
    • Render-target debug display
    • Mirror
    • Phong shading pipelines
    • Offscreen
  • setupDescriptorPool
  • setupDescriptorSet: 为三个pipeline设置
    • Mirror plane descriptor set (Mirror)
    • Shaded descriptor sets (Phong shading pipelines)
    • Offscreen
  • buildCommandBuffers: subpass有2个
    • First render pass: Offscreen rendering
    • Scene rendering with applied radial blur

render

  • draw
  • updateUniformBuffers
  • updateUniformBufferOffscreen

小结

   离屏渲染也就是将渲染结果写入 attachment中 . 是 attachment 结合 subpass的一种实用方法.

Vulkan Samples 阅读 -- Basics(五): Input Attachments Sub Passes Offscreen Renderings相关推荐

  1. Vulkan Samples 阅读 -- Extensions(二)

    目录 Conditional Rendering prepare render shader 小结 Debug Markers Negative Viewport Height prepare ren ...

  2. Vulkan Samples 阅读 -- Hardware Accelerated Ray Tracing(一) Basic Ray Tracing Ray Traced Shadows

    目录 Basic Ray Tracing prepare render shader 小结 Ray Traced Shadows prepare render shader 小结 Basic Ray ...

  3. Zero-shot Learning零样本学习 论文阅读(五)——DeViSE:A Deep Visual-Semantic Embedding Model

    Zero-shot Learning零样本学习 论文阅读(五)--DeViSE:A Deep Visual-Semantic Embedding Model 背景 Skip-gram 算法 算法思路 ...

  4. Alibaba Druid 源码阅读(五)数据库连接池 连接关闭探索

    Alibaba Druid 源码阅读(五)数据库连接池 连接关闭探索 简介 在上文中探索了数据库连接池的获取,下面接着初步来探索下数据库连接的关闭,看看其中具体执行了那些操作 连接关闭 下面的具体的代 ...

  5. 2015私人阅读十五佳

    2015私人阅读十五佳 2015私人阅读十五佳 统计 私人阅读十五佳 非暴力沟通 沟通的艺术 看入人里看出人外 父母效能训练手册 对伪心理学说不 精益创业 新创企业的成长思维 枪炮病菌与钢铁 人类简史 ...

  6. 论文阅读笔记(五)——狐猴识别系统:一种便于狐猴个体识别的面部识别系统

    论文阅读笔记(五)--狐猴识别系统:一种便于狐猴个体识别的面部识别系统 论文简介 论文中文翻译:狐猴识别系统:一种便于狐猴个体识别的面部识别系统 论文名称:<LemurFaceID: a fac ...

  7. Vulkan学习(十五): 总结

    目录 Vulkan-Tutorial 学习相关资源整理 开发环境搭建 Compile Shader Shader Compile 素材 Vulkan 教程项目结构 初始化 Vulkan 相关 渲染循环 ...

  8. L2.五.input语句

    number = 20 user_number = int(input('请输入一个数字:'))if user_number > number: print('猜大了')elif user_nu ...

  9. 阅读笔记五2017.2.13

    11章的内容承接前面的章节提到了软件的设计与实现.前面的内容讲了如何解决用户需求,本章则讲了如何解决用户的需求.解决的过程要先进行建模,建模的思想在我以前的学习中就有接触,从小学习数学,而解决数学问题 ...

  10. Mybatis源码阅读(五 ):接口层——SqlSession

    *************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如 ...

最新文章

  1. STM32处理器存储空间布局解析
  2. k8s启动Pod遇到CrashLoopBackOff的解决方法
  3. LeetCode Power of Two
  4. 【易创课堂】第3期,最后2天报名啦!
  5. 抓包mysql协议_Mysql 通信协议抓包分析
  6. 前端编码风格规范(3)—— JavaScript 规范
  7. adb server is out of date. linux,adb server is out of date. killing完美解决
  8. 用jQuery实现简单的加入收藏页面的功能
  9. kafka介绍和集群环境搭建
  10. python接口自动化(二十二)--unittest执行顺序隐藏的坑(详解)
  11. python 3.6.5 模拟银行转账系统
  12. office完全卸载工具
  13. linux fedora frebsd centos linux as 安装出错
  14. nokia 5220 XpressMusic 自己刷机
  15. 计算机毕业设计Java新疆旅游专列订票系统(源码+系统+mysql数据库+Lw文档)
  16. 【智力题】小环绕大环
  17. Gson格式化LocalDateTime
  18. C#连接MySQL数据库详细步骤
  19. Gopher China 2019 讲师专访-Grab/地图团队资深架构师胡泊
  20. ensp 模拟器配置无线网络

热门文章

  1. ETL工具-Kettle Spoon教程
  2. kettle下载和使用
  3. scm中mysql作用_scm供应链管理的作用
  4. 地理高程数据SRTM3简介
  5. 常用Fragstats景观指数
  6. ISO27145协议解析
  7. c语言初学者程序,C语言初学者必懂的100个范例程序
  8. comsol 超声声场模拟_Comsol Multiphysics 声场仿真模块整体介绍
  9. 创建一个简单的MFC程序
  10. Hexo添加helper-live2d模型