当前位置: 首页 > article >正文

vulkan从小白到专家——RenderPassFramebuffer

渲染最重要的就是每帧的执行逻辑,一帧包含多个renderPass,renderPass是包含了一组pipeline,pipeline跟drawcall基本上一一对应。
RenderPass定义了vulkan渲染过程中要使用到的三种Object的细节,分别是

  • Framebuffer Attachment,
  • Subpass
  • Subpass Dependency
    在这里插入图片描述

1 Framebuffer

简称fb,渲染中的RenderTarget,rt。
渲染前创建的Framebuffer的个数必须跟交换链的图像个数保持一致。

Framebuffer跟交换链的区别

每个交换链都需要创建framebuffer。Vulkan中的swapchain实际没有持有具体图像数据ImageView。framebuffer不同于交换链 实际持有一组图像。

1)从技术上讲,交换链与帧缓冲毫无关系。交换链是一系列你并不拥有的图像。你可以请求显示引擎借用其中一幅图像一段时间,在此期间,你可以向其进行渲染,或者执行交换链允许你对其图像执行的任何其他操作。
过一段时间后,你可以告知显示引擎将你使用过的图像显示到特定显示器上,之后,在再次借用该图像之前,你无法再使用该交换链图像。
2)因此,尽管它们都有 “一系列图像”,但二者毫无相似之处。在渲染操作期间,帧缓冲会根据渲染通道的子通道附件使用规则,向其所有图像进行渲染。你无需同时借用交换链中的所有图像,只需一次借用一幅图像(每个显示表面一幅)。
3)由于交换链图像只能以显示引擎允许的方式使用,而显示引擎唯一允许的使用方式只有将其作为颜色附件,所以如果你确实想在显示设备上看到结果(Vulkan 并不要求必须这样做),那么交换链中的图像最终会在某个时候进入 VkFramebuffer。
参考

这里的显示引擎,不是渲染引擎,是Display System 专门负责把颜色缓冲区的内容发送上屏的模块,驱动再往下一层的概念。比如双缓存模式下,前缓冲图像被发送到显示器上,后缓存区作为渲染目标,被opengl/vulkan 读写操作。
第3点提及的想要在渲染过程中,使用交换链的图像,唯一的方式把颜色缓冲区附件作为pipeline的uniform对象作为输出,

Framebuffer的CreateInfo结构体如下:

VkFramebufferCreateInfo fbCreateInfo{
   
        .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
        .pNext = nullptr,
        .renderPass = renderPass,
        .attachmentCount = 1,  // 2 if using depth
        .pAttachments = attachments,
        .width = static_cast<uint32_t>(swapchain.displaySize_.width),
        .height = static_cast<uint32_t><

http://www.kler.cn/a/527675.html

相关文章:

  • android主题设置为..DarkActionBar.Bridge时自定义DatePicker选中日期颜色
  • 【设计测试用例自动化测试性能测试 实战篇】
  • 代码随想录|动态规划 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组
  • C语言------数组从入门到精通
  • 中国股市“慢牛”行情的实现路径与展望
  • 跨境数据传输问题常见解决方式
  • JavaScript函数中this的指向
  • python 文件操作全知道 | python 小知识
  • 36. printf
  • 团体程序设计天梯赛-练习集——L1-029 是不是太胖了
  • 大模型高频知识汇总:查漏补缺参考大全
  • 【Redis】set 和 zset 类型的介绍和常用命令
  • oracl:多表查询>>表连接[内连接,外连接,交叉连接,自连接,自然连接,等值连接和不等值连接]
  • Docker小游戏 | 使用Docker部署跳一跳经典小游戏
  • 23.Word:小王-制作公司战略规划文档❗【5】
  • Python3 + Qt5:实现AJAX异步更新UI
  • EtherCAT主站IGH-- 25 -- IGH之fsm_slave_scan.h/c文件解析
  • DeepSeek 使用初体验
  • Git的安装步骤详解(复杂的安装界面该如何勾选?)
  • 在线知识库创建与维护提升企业效率与知识共享能力
  • 【Unity3D】实现横版2D游戏角色二段跳、蹬墙跳、扶墙下滑
  • Linux Vim编辑器:快捷键与高效编辑技巧
  • C语言指针专题一 -- 指针基础原理
  • 【Linux】使用管道实现一个简易版本的进程池
  • Pandas 常用函数
  • 【PLL】杂散生成和调制