Vulkan Samples 阅读 -- Basics(五): Input Attachments Sub Passes Offscreen Renderings
目录
- 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
- descriptorSetLayoutBinding: 三个
- 创建3个pool
- 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
- VkGraphicsPipelineCreateInfo: 多出了为Attachment配置的代码
- 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
- createGBufferAttachments: 创建Gbuffer
- 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
- 创建3个pool
- setupDescriptorSet
- vkAllocateDescriptorSets
- writeDescriptorSets
- prepareCompositionPass:
- Descriptor set layout
- descriptorSetLayoutBinding
- Position input attachment
- Normal input attachment
- Albedo input attachment
- Light positions
-vkCreateDescriptorSetLayout
- descriptorSetLayoutBinding
- Pipeline layout
- vkCreatePipelineLayout
- Descriptor sets
- vkAllocateDescriptorSets
- writeDescriptorSets
- writeDescriptorSet
- Position texture target
- Normals texture target
- Albedo texture target
- Fragment shader lights
-vkUpdateDescriptorSets
- writeDescriptorSet
- Pipeline
- pipelineCreateInfo
- vkCreateGraphicsPipelines
- Transparent (forward) pipeline
- vkCreateDescriptorSetLayout
- vkCreatePipelineLayout
- vkAllocateDescriptorSets
- vkUpdateDescriptorSets
- vkCreateGraphicsPipelines
- Descriptor set layout
- 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相关推荐
- Vulkan Samples 阅读 -- Extensions(二)
目录 Conditional Rendering prepare render shader 小结 Debug Markers Negative Viewport Height prepare ren ...
- 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 ...
- Zero-shot Learning零样本学习 论文阅读(五)——DeViSE:A Deep Visual-Semantic Embedding Model
Zero-shot Learning零样本学习 论文阅读(五)--DeViSE:A Deep Visual-Semantic Embedding Model 背景 Skip-gram 算法 算法思路 ...
- Alibaba Druid 源码阅读(五)数据库连接池 连接关闭探索
Alibaba Druid 源码阅读(五)数据库连接池 连接关闭探索 简介 在上文中探索了数据库连接池的获取,下面接着初步来探索下数据库连接的关闭,看看其中具体执行了那些操作 连接关闭 下面的具体的代 ...
- 2015私人阅读十五佳
2015私人阅读十五佳 2015私人阅读十五佳 统计 私人阅读十五佳 非暴力沟通 沟通的艺术 看入人里看出人外 父母效能训练手册 对伪心理学说不 精益创业 新创企业的成长思维 枪炮病菌与钢铁 人类简史 ...
- 论文阅读笔记(五)——狐猴识别系统:一种便于狐猴个体识别的面部识别系统
论文阅读笔记(五)--狐猴识别系统:一种便于狐猴个体识别的面部识别系统 论文简介 论文中文翻译:狐猴识别系统:一种便于狐猴个体识别的面部识别系统 论文名称:<LemurFaceID: a fac ...
- Vulkan学习(十五): 总结
目录 Vulkan-Tutorial 学习相关资源整理 开发环境搭建 Compile Shader Shader Compile 素材 Vulkan 教程项目结构 初始化 Vulkan 相关 渲染循环 ...
- L2.五.input语句
number = 20 user_number = int(input('请输入一个数字:'))if user_number > number: print('猜大了')elif user_nu ...
- 阅读笔记五2017.2.13
11章的内容承接前面的章节提到了软件的设计与实现.前面的内容讲了如何解决用户需求,本章则讲了如何解决用户的需求.解决的过程要先进行建模,建模的思想在我以前的学习中就有接触,从小学习数学,而解决数学问题 ...
- Mybatis源码阅读(五 ):接口层——SqlSession
*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如 ...
最新文章
- STM32处理器存储空间布局解析
- k8s启动Pod遇到CrashLoopBackOff的解决方法
- LeetCode Power of Two
- 【易创课堂】第3期,最后2天报名啦!
- 抓包mysql协议_Mysql 通信协议抓包分析
- 前端编码风格规范(3)—— JavaScript 规范
- adb server is out of date. linux,adb server is out of date. killing完美解决
- 用jQuery实现简单的加入收藏页面的功能
- kafka介绍和集群环境搭建
- python接口自动化(二十二)--unittest执行顺序隐藏的坑(详解)
- python 3.6.5 模拟银行转账系统
- office完全卸载工具
- linux fedora frebsd centos linux as 安装出错
- nokia 5220 XpressMusic 自己刷机
- 计算机毕业设计Java新疆旅游专列订票系统(源码+系统+mysql数据库+Lw文档)
- 【智力题】小环绕大环
- Gson格式化LocalDateTime
- C#连接MySQL数据库详细步骤
- Gopher China 2019 讲师专访-Grab/地图团队资深架构师胡泊
- ensp 模拟器配置无线网络