Vulkan中renderpass、subpass、dependency的见解
创始人
2025-06-01 19:18:48
0

在Vulkan中,渲染通道 Render Pass 是一个描述渲染过程中使用的附件的对象,可以包含多个 subpass 和附件依赖关系

假设我们需要创建一个render pass,它包含2个附件、1个子通道、2个子通道依赖

步骤如下:

1、创建附件(颜色附件和深度/模板缓冲附件)

  • 当你创建附件时,它的描述符中并没有指定该附件是颜色附件还是深度附件,仅仅是描述了这块内存的像素格式等信息
  • 对于附件描述符内的 initialLayoutfinalLayout 指定的是该附件在Renderpass之前和之后的布局,这个布局会在渲染过程中发生改变,不过最终布局还是会变成 finalLayout 指定的那样
void setupRenderPass()
{// 两个附件的描述符std::array attachments = {};attachments[0].format = VK_FORMAT_B8G8R8A8_UNORM;                attachments[0].samples = VK_SAMPLE_COUNT_1_BIT;                  // 不使用多重采样attachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;             // 在渲染通道开始时清除此附件attachments[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE;           // 在渲染通道结束后保留其内容(以供显示)attachments[0].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;  // 不使用模板,所以不需要加载attachments[0].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;// 同上attachments[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;         // 渲染通道开始时的布局。初始布局并不重要,所以我们使用未定义的布局attachments[0].finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;     // 渲染通道结束时转换到的布局,由于我们想将颜色缓冲区呈现到交换链,因此我们转换为PRESENT_KHR布局attachments[1].format = VK_FORMAT_D32_SFLOAT_S8_UINT;                                           attachments[1].samples = VK_SAMPLE_COUNT_1_BIT;attachments[1].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;                           // 在第一个子通道开始时清除深度attachments[1].storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;                     // 渲染通道结束后我们不需要深度(DONT_CARE可以提高性能)attachments[1].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;                // 没使用模板attachments[1].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;              attachments[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;                      // 理由同上attachments[1].finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; // 转换为深度/模板附件的布局

2、创建subpass中需要用到的附件的引用

  • 附件引用是用来指定在子通道中使用附件的方式的。通过附件引用,我们可以指定每个子通道将使用哪个附件、以及该附件在subpass中的初始布局
  • 为什么有附件引用这一层,而不直接使用附件呢?
    如果直接使用附件,我们就无法控制每个子通道中使用附件的方式和初始布局方式,例如每个子通道使用的布局不同,或者某个子通道中不需要使用某个附件。而通过附件引用,我们可以灵活地控制每个子通道中附件的使用方式,从而提高渲染效率和质量
  • 如果有多个子通道,就需要创建对应数量的附件引用。在子通道描述符中,可以指定使用哪些附件引用,以及它们在当前子通道中的使用方式
  • VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL 是一个指定图像布局的枚举值,表示图像在当前子通道中被用作颜色附件时的最优布局。这个布局是对颜色附件进行优化的,以便最大化图形渲染的性能。这个布局在颜色附件被用作输入附件时是不合适的,因为它会使输入附件的读取性能变慢。后面的深度附件引用也同理
	// Setup attachment referencesVkAttachmentReference colorReference = {};colorReference.attachment = 0;                                    colorReference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; VkAttachmentReference depthReference = {};depthReference.attachment = 1;                                            depthReference.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; 

3、创建子通道

子通道的处理过程中,附件引用的布局在创建引用的时候就指定过了

	VkSubpassDescription subpassDescription = {};subpassDescription.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;subpassDescription.colorAttachmentCount = 1;                            subpassDescription.pColorAttachments = &colorReference;      // 颜色附件引用subpassDescription.pDepthStencilAttachment = &depthReference;// 深度附件引用

4、创建子通道依赖

  • 只有一个子通道,但需要两个子通道依赖,原因是需要对两种附件进行不同的状态变换
  • VK_SUBPASS_EXTERNAL 是一个特殊的常数,它代表所有在实际渲染通道之外执行的命令
  • 每个子通道对应的附件布局会根据需要进行隐式布局转换,通过子通道依赖进行定义,比如将颜色附件布局从 COLOR_ATTACHMENT_OPTIMAL 转换为 TRANSFER_SRC_OPTIMAL 以进行图像数据拷贝
	// Setup subpass dependenciesstd::array dependencies;dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL;dependencies[0].dstSubpass = 0;dependencies[0].srcStageMask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;dependencies[0].dstStageMask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;dependencies[0].srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;dependencies[0].dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;dependencies[0].dependencyFlags = 0;dependencies[1].srcSubpass = VK_SUBPASS_EXTERNAL;dependencies[1].dstSubpass = 0;dependencies[1].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;dependencies[1].dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;dependencies[1].srcAccessMask = 0;dependencies[1].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;dependencies[1].dependencyFlags = 0;

5 、创建Render pass

	// Create the actual renderpassVkRenderPassCreateInfo renderPassInfo = {};renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;renderPassInfo.attachmentCount = static_cast(attachments.size());  // renderpass附件数renderPassInfo.pAttachments = attachments.data();                            renderPassInfo.subpassCount = 1;                                             // subpass个数renderPassInfo.pSubpasses = &subpassDescription;                             renderPassInfo.dependencyCount = static_cast(dependencies.size()); // subpass dependencies个数renderPassInfo.pDependencies = dependencies.data();                          VK_CHECK_RESULT(vkCreateRenderPass(device, &renderPassInfo, nullptr, &renderPass));
}

相关内容

热门资讯

2026快手创新与知识产权白皮... 快手以技术创新链与产业应用链双螺旋为核心架构,搭配知识产权支撑体系,形成 AI 时代完整的创新与价值...
被救活了!澳洲这个知名网购平台... 好消息!Click Frenzy被救活啦! Click Frenzy,是澳洲一个线上大促平台,前段时...
追觅CEO俞浩一天发了117条... 近日,追觅科技CEO俞浩在个人社交平台开启超高强度更新模式。短短三天时间里,他在多个社交平台密集发布...
“红利+”策略指数走势分化,价... 5月6日早盘,市场震荡上行,科技成长方向表现强势,“红利+”策略指数走势分化。截至午间收盘,国证自由...
工业增加值增速创五年新高 福田... 凭借在人工智能领域的深耕,企业扎堆的福田区的天使荟·千模应用加速器不仅摘得深圳多项荣誉,更于近日获评...
原创 敢... 大家好,我是言叔。最近,79岁的“玻璃大王”曹德旺在公开场合放出一句霸气十足的狠话——面对美国可能加...
原创 丧... 溃败边缘狗急跳墙!泽连斯基攻击自家核电站,要拉欧洲同归于尽。战场即将崩盘、停战必死无疑,泽连斯基早已...
A股大涨,超4000只个股上涨... 五一小长假后首个交易日,A股三大指数集体高开,其中,上证指数高开0.57%,深证成指高开1.43%,...
五粮液的大戏,只是拉开序幕 4月30日,赶在五一假期前最后一个交易日,趁着全国人民准备出门旅游的当口,五粮液甩出了多份公告。 其...
原创 存... 这几天发生了不少大事,我们简单捋一捋。三部门放大招,要扩大科技创新贷款投放。 美国对欧盟汽车加征25...
A2奶粉因检出“呕吐毒素”在美... 北京5月5日电(记者 赵方园)新西兰乳企a2牛奶公司卷入蜡样芽孢杆菌毒素召回风波。 5月3日晚,中国...
新股消息 | 从招股书看好医生... 智通财经APP获悉,当市场仍习惯用“传统互联网医疗平台”甚至“传统医药流通渠道”来理解好医生云医疗时...
科创50指数大涨超8% 半导体... 上证报中国证券网讯 5月6日,A股主要股指早盘集体走强。截至午间收盘,沪指涨1.27%,深证成指涨2...
体验经济蓬勃发展,“五一”假期... 今年劳动节假期,部分省市放春假提前预热“假日经济”,传统热门目的地客流量持续增长,曾经的“小众目的地...
互学互鉴促合作 携手共赢谋发展... 5月4日,新乡市工商联“新商课堂”九期班开展企业互访活动。 首站参访了新乡市瑞龙商贸有限公司,该企...
港股异动|诺比侃大跌15.8%... 诺比侃(2635.HK)大幅下跌15.8%,现报20.24港元股价再度逼近上市低位,市值76.7亿港...
文远知行股权曝光:韩旭持股6.... 雷递网 雷建平 5月6日 文远知行(WeRide)日前发布截至2025年12月31日的年报。年报显示...
马斯克同意支付超1000万元罚... 美国证券交易委员会(SEC)与马斯克就收购推特期间的违规诉讼达成和解,相关法庭文件正式提交。 根据协...
大盘放量上攻,全市场半日成交额... 5月6日早盘,A股三大指数集体走强,沪指涨1.27%,冲击五连阳,全市场成交额超2万亿元,较上一交易...
学法守法懂经营 合规治企促发展 为进一步规范机动车驾驶员培训行业经营秩序,指导驾培企业增强税法意识、防范涉税风险、用好税收政策,助力...