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

【Vulkan入门】08-CreateRenderPass

目录

  • 先叨叨
  • git信息
  • 关键代码
    • TestPipeLine::CreateRenderPass()

先叨叨

上篇已经为Pipeline编写好了程序(Shader)。接下来要为Pipeline创建RenderPass。
关于RenderPass,在【Vulkan入门】06-Pipeline介绍中已经作了简单的介绍。这里再详细说一下。
RenderPass实则描述了Pipeline在渲染时所需要的内存空间(Memory)。 RenderPass中描述了很多内存空间,有的空间用于存储深度信息,有的用于存储颜色信息, 有的存储模板信息等。每次描画我们都需要告诉Vulkan当前的Pipeline要使用哪个RenderPass。

一个RenderPass可以供给多个Pipeline使用,而一个Pipeline只能使用一个RenderPass。目前例子中只有一个Pipeline和一个RenderPass。
这里需要注意一点,RenderPass只是描述了内存的内容、用途和属性,并没有管理内存空间。内存空间需要由FrameBuffer对象来管理。下一篇会介绍如何创建FrameBuffer
在这里插入图片描述

git信息

  • repository: https://gitee.com/J8_series/easy-car-ui
  • tag: 08-CreateRenderPass
  • url: https://gitee.com/J8_series/easy-car-ui/tree/08-CreateRenderPass

关键代码

TestPipeLine::CreateRenderPass()

  • 内存空间对于RenderPass来说叫作Attachment。目前例子只使用一块内存保存图像的颜色,因此只声明一个colorAttachment对象。

    • format是VK_FORMAT_R8G8B8A8_UINT,代表存储RGB颜色。
    • samples是VK_SAMPLE_COUNT_1_BIT代表采样数为1
    • loadOp是VK_ATTACHMENT_LOAD_OP_CLEAR,代表使用前需要清空内存空间。
    • storeOp是VK_ATTACHMENT_STORE_OP_STORE,代表该内存空间的内容是由Pipeline写入的。因为我们想让Pipeline将颜色值写到这块内存中。
    • stencilLoadOp和stencilStoreOp 根模板和深度缓存操作有关。目前并不关心所以赋值_DONT_CARE。
    • initialLayout是VK_IMAGE_LAYOUT_UNDEFINED,代表我们没有定义它初始化时的数据来源。
    • finalLayout是VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,代表我们想让Vulkan在渲染后把它设置成便于传输的状态。因为我想在渲染后把这块内存的内容读出来,然后渲染到屏幕上。
  • 每个RenderPass中可以包含多个SubPass, 每个SubPass会引用多个Attachment。之前说每次描画我们都要告诉Vulkan,Pipeline需要使用哪个RenderPass。更准确的说法是,要告诉Vulkan,Pipeline需要使用哪个RenderPass的哪个SubPass。

  • 多个SubPass之间可以存在依赖关系。比如第一个SubPass可以作为第二个SubPass的输入。
    目前例子中只有一个SubPass引用了唯一的colorAttachment

    void TestPipeLine::CreateRenderPass()
    {
        //https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VkAttachmentDescription
        VkAttachmentDescription colorAttachment{};
        colorAttachment.format = VK_FORMAT_R8G8B8A8_UINT;
        colorAttachment.samples = VK_SAMPLE_COUNT_1_BIT;
        colorAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
        colorAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
        colorAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
        colorAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
        colorAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
        colorAttachment.finalLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;

        //https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VkAttachmentReference
        VkAttachmentReference colorAttachmentRef{};
        colorAttachmentRef.attachment = 0;
        colorAttachmentRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;

        //https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VkSubpassDescription
        VkSubpassDescription subpass{};
        subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
        subpass.colorAttachmentCount = 1;
        subpass.pColorAttachments = &colorAttachmentRef;

        //https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VkSubpassDependency
        VkSubpassDependency dependency{};
        dependency.srcSubpass = VK_SUBPASS_EXTERNAL;
        dependency.dstSubpass = 0;
        dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
        dependency.srcAccessMask = 0;
        dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
        dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;

        //https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VkRenderPassCreateInfo
        VkRenderPassCreateInfo createInfo{};
        createInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
        createInfo.attachmentCount = 1;
        createInfo.pAttachments = &colorAttachment;
        createInfo.subpassCount = 1;
        createInfo.pSubpasses = &subpass;
        createInfo.dependencyCount = 1;
        createInfo.pDependencies = &dependency;

        //https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#vkCreateRenderPass
        if (VK_SUCCESS != vkCreateRenderPass(m_device, &createInfo, nullptr, &m_renderPass))
        {
            throw std::runtime_error("To create render pass is failed!");
        }
    }

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

相关文章:

  • 结合大语言模型的异常检测方法研究
  • 音视频入门基础:AAC专题(13)——FFmpeg源码中,获取ADTS格式的AAC裸流音频信息的实现
  • Python的安装过程和环境搭建(超详细过程)
  • [Python3] Sanic中间件
  • Next.js 14 性能优化:从首屏加载到运行时优化的最佳实践
  • Ruby+Selenium教程
  • 第四学期-智能数据分析-期末复习题
  • mysql高级篇 |尚硅谷 | 第1章_Linux下MySQL的安装与使用
  • nacos服务注册流程
  • docker-基础
  • 连锁美业门店管理系统【数据分析】功能能为门店经营带来什么帮助?
  • Excel 合并工具 将文件复制到目标工作表中与操作日志记录
  • C# 异常处理全解析:让程序告别崩溃噩梦
  • 在多个分布式机器间设置和使用 NFS(Network File System)共享目录的步骤如下:
  • 家校通小程序实战教程06口令验证
  • ArrayBuffer,TypedArray,Int8Array 和Blob的关系
  • python爬虫常用数据保存模板(Excel、CSV、mysql)——scrapy中常用数据提取方法(CSS、XPATH、正则)(23)
  • EFCore PostgreSQL在.NET9生成迁移文件错误
  • 【前端】浏览器输入url到页面呈现发生了什么?
  • csrf漏洞复现
  • Copilot for Microsoft 365 Plugins 示例项目教程
  • FM25V20A-DGQ:耐用、快速、低功耗的F-RAM
  • kcat - Apache Kafka producer and consumer tool
  • 调度系统:基于 Couchbase 构建数仓 Temporal、Apache Airflow 和 DonpinScheduler 的详细比较
  • IdentityServer4框架、ASP.NET core Identity
  • ios使用UIScrollView和PageControl创建图片轮播