【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!");
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/934103.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从 HTTP 到 HTTPS 再到 HSTS

近些年,随着域名劫持、信息泄漏等网络安全事件的频繁发生,网站安全也变得越来越重要,也促成了网络传输协议从 HTTP 到 HTTPS 再到 HSTS 的转变。 HTTP HTTP(超文本传输协议) 是一种用于分布式、协作式和超媒体信息系…

01-Chromedriver下载与配置(mac)

下载地址: 这里我用的最后一个,根据自己chrome浏览器选择相应的版本号即可 ChromeDriver官网下载地址:https://sites.google.com/chromium.org/driver/downloads ChromeDriver官网最新版下载地址:https://googlechromelabs.git…

面试技术点之安卓篇

一、基础 二、高级 三、组件 Android中SurfaceView和TextureView有什么区别? 参考 Android中SurfaceView和TextureView有什么区别? 四、三方框架 五、系统源码 六、性能优化

架构13-持久化存储

零、文章目录 架构13-持久化存储 1、Kubernetes 存储设计 (1)存储设计考量 **设计哲学:**Kubernetes 遵循用户通过资源和声明式 API 描述意图,Kubernetes 根据意图完成具体操作。**复杂性:**描述用户的存储意图本身…

可视化建模以及UML期末复习----做题篇

一、单项选择题。(20小题,每小题2分,共40分) 1、UML图不包括( ) A、用例图 B、状态机图 C、流程图 D、类图 E、通信图 答案:C、流程图 UML中不包括传统意义上的流程图,流程图通常是指B…

idea_maven详解

秒懂Maven maven简介maven安装和配置maven本地配置maven工程的GAVP创建maven工程项目结构说明项目构建说明 Maven依赖管理核心信息配置依赖管理配置依赖信息查询依赖范围设置依赖属性配置依赖下载失败错误解决Build构建配置依赖传递依赖冲突 maven工程继承继承作用应用场景继承…

vue3+vite纯前端实现自动触发浏览器刷新更新版本内容,并在打包时生成版本号文件

前言 在前端项目中,有时候为了实现自动触发浏览器刷新并更新版本内容,可以采取一系列巧妙的措施。我的项目中是需要在打包时候生成一个version.js文件,用当前打包时间作为版本的唯一标识,然后打包发版 ,从实现对版本更…

鸿蒙实现应用通知

目录: 1、应用通知的表现形式2、应用通知消息的实现1、发布普通文本类型通知2、发布进度类型通知3、更新通知4、移除通知 3、设置通知道通展示不同形式通知4、设置通知组5、为通知添加行为意图1、导入模块2、创建WantAgentInfo信息3、创建WantAgent对象4、构造Notif…

2024 年 MySQL 8.0.40 安装配置、Workbench汉化教程最简易(保姆级)

首先到官网上下载安装包:http://www.mysql.com 点击下载,拉到最下面,点击社区版下载 windows用户点击下面适用于windows的安装程序 点击下载,网络条件好可以点第一个,怕下着下着断了点第二个离线下载 双击下载好的安装…

【RabbitMQ】RabbitMQ中核心概念交换机(Exchange)、队列(Queue)和路由键(Routing Key)等详细介绍

博主介绍:✌全网粉丝21W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…

【C++笔记】AVL树的深度剖析

【C笔记】AVL树的深度剖析 🔥个人主页:大白的编程日记 🔥专栏:C笔记 文章目录 【C笔记】AVL树的深度剖析前言一. AVL树的概念二.AVL树的实现2.1 AVL树的结构2.2 AVL树的插入2.3 平衡因子更新 三.旋转3.1旋转的原则3.2右单旋3.3左…

Ubuntu 环境安装 之 RabbitMQ 快速入手

Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:RabbitMQ 📚本系列文章为个人学…

贪心算法专题(四)

目录 1. 单调递增的数字 1.1 算法原理 1.2 算法代码 2. 坏了的计算器 2.1 算法原理 2.2 算法代码 3. 合并区间 3.1 算法原理 3.2 算法代码 4. 无重叠区间 4.1 算法原理 4.2 算法代码 5. 用最少数量的箭引爆气球 5.1 算法原理 ​5.2 算法代码 1. 单调递增的数字…

IAR环境下的FlashLoader设计

目录 1.为什么要Flash Loader 2.Flash Loader设计细节 2.1 简单的代码框架 2.2 迷人的宏使用 2.3 关键的配置文件 3.dmac和mac文件 4.小结 搞国产车规芯片,IAR是必不可少的编译调试集成工具,历史背景不赘述,今天主要聊聊基于IAR的Fla…

一些硬件知识【2024/12/6】

MP6924A: 正点原子加热台拆解: PMOS 相比 NMOS 的缺点: 缺点描述迁移率低PMOS 中的空穴迁移率约为电子迁移率的 1/3 到 1/2,导致导通电流较低。开关速度慢由于迁移率较低,PMOS 的开关速度比 NMOS 慢,不适合高速数字电…

在本地运行大语言模型

1,打开下面网站下载,软件 lm studio 2, 设置模型下载路径 3,没有魔法条件的人,去镜像网站下载模型的镜像文件 、 4,

【单片机】ESP32-S3+多TMC2209控制步进电机系列3 使用TMC2209库实现UART通讯

目录 1.下载TMC2209.h库2.代码部分3.效果展示 1.下载TMC2209.h库 在Arudino环境中,有两个不错的库可以驱动TMC2209。 TMC2209库TMCStepper库 TMC2209库只针对TMC2209驱动器,而TMCStepper库除了能够支持TMC2209驱动器,还能够支持其他TMC的驱…

【服务器部署应用由http协议切换为https】

文章目录 服务器部署应用由http协议切换为https1. 下载openssl及其配置1.1 下载1.2 无脑下一步即可1.3 环境变量配置1.4 验证配置以及生成证书证书路径 2. nginx配置修改 服务器部署应用由http协议切换为https 1. 下载openssl及其配置 1.1 下载 openssl下载地址 根据系统选择…

Linux——管理用户和用户组

一、用户有哪些 root用户 定义:root用户是Linux系统中的最高权限用户,具有对系统所有资源的完全控制权。特性:root用户可以执行系统中的任何操作,包括修改系统配置文件、安装软件、管理系统服务等。由于其拥有最高权限&#xff0c…

synchronized的特性

1.互斥 对于synchronized修饰的方法及代码块不同线程想同时进行访问就会互斥。 就比如synchronized修饰代码块时,一个线程进入该代码块就会进行“加锁”。 退出代码块时会进行“解锁”。 当其他线程想要访问被加锁的代码块时,就会阻塞等待。 阻塞等待…