Vulkan Material 设计学习

在学习 http://xiaopengyou.fun/public/2019/09/20/20_Material/ 的时候遇到的一些问题

初始化

初始化的时候 VkWriteDescriptorSet 把 ring buffer 绑定到 descriptor set

在每帧的最后,提交完 uniform buffer 的数据之后,vkCmdBindDescriptorSets 把 descriptor set 绑定到 command buffer

dynamicOffsetCount

其实他一开始是用 dynamicOffsetCount 来暂存计数值,他只是一个过程量,为了根据 set 和 binding 的顺序来设置 uniform buffer 的 offset 的索引的顺序

比如现在一个 shader 有四个 uniform buffer,那么

set = 0 binding = 0

set = 1 binding = 1

set = 0 binding = 1

set = 0 binding = 2

那么对应的 offset 的 index 为 0 3 1 2

但是之后他就拿 dynamicOffsetCount 当作 uniform buffer 的数量了

如果从一个独立的函数来看,突兀的出现这么一个量就让人困惑

其实最合适的就是在其他地方把他替换成 uniformBuffers.size()

有一个令我疑惑的问题

他有一个 vk_demo::DVKMaterial::BuffersMap vk_demo::DVKMaterial::uniformBuffers

SetLocalUniform 与 SetGlobalUniform

然后有三个函数 SetLocalUniform SetGlobalUniform SetStorageBuffer 都要从这个 map 中找对应的 buffer

SetLocalUniform 拿到数据指针之后,直接把数据存到 ring buffer,并且把存储到 ring buffer 的首地址存在 dynOffsets

SetGlobalUniform 拿到数据指针之后,却会把数据存在 uniformBuffers 这个 map 的 buffer 中

然后在 BeginFrame() 中,再把 SetGlobalUniformuniformBuffers 中存储的数据拿出来,存到 ring buffer

为什么是在 BeginFrame() 中拷贝 global uniform?为什么 global 暂存而非 global 的不暂存?

一开始我还觉得是不是多此一举,后来才明白不是

因为其实你每帧都在往 ring buffer 中写数据,而 global 的数据,不是在渲染主循环中提供的,而是只在初始化的时候提供一次

所以你需要暂存 global uniform buffer 的数据,而不用存 local 的

具体的可以看 BeginObject()

    void DVKMaterial::BeginObject(){int32 index = (int32)perObjectIndexes.size();perObjectIndexes.push_back(index);int32 offsetStart = index * dynamicOffsetCount;// 扩充dynamicOffsets尺寸以便能够保持每个Object的参数if (offsetStart + dynamicOffsetCount > dynamicOffsets.size()){// 因为每一次都是当前长度 + dynamicOffsetCount 来判断// 所以每一次增长的长度也是 dynamicOffsetCount// 就是实现了每次增加元素都是增加 dynamicOffsetCount 个元素for (uint32 i = 0; i < dynamicOffsetCount; ++i){dynamicOffsets.push_back(0);}}// 拷贝GlobalOffsets// 但是 offsetIndex < dynamicOffsetCount 这里的终点是 dynamicOffsetCount// 那么其实只有 index = 0 的情况下这里才会被执行// 那么其实这里相当于 dynamicOffsets[0...dynamicOffsetCount-1] = globalOffsets[0...dynamicOffsetCount-1]// 应该改为 offsetIndex < offsetStart + dynamicOffsetCount?// 这个 globalOffsets 是只有一个 dynamicOffsetCount 的长度,因为全局的 uniform buffer 只需要一份数据,所以只需要一份 offset// 在不存储更多信息的情况下,你不知道全局的 uniform buffer 是否存在,即使它存在,你也不知道全局的 uniform buffer 的 offset 的 index 是什么// 因此这里直接把整个 globalOffsets 拷贝到这一个物体所对应的整个 offset 区间中// 假设当前使用的 shader 没有全局的 uniform buffer,那么 dynamicOffsets 这一段区间最终也会赋为被非全局的 uniform buffer 的 offset// 假设当前使用的 shader 有全局的 uniform buffer,那么 dynamicOffsets 这一段区间上,某一个位置会是全局的 uniform buffer 的 offset,// 剩下的位置会被非全局的 uniform buffer 的 offset 填充for (uint32 offsetIndex = offsetStart; offsetIndex < offsetStart + dynamicOffsetCount; ++offsetIndex){dynamicOffsets[offsetIndex] = globalOffsets[offsetIndex - offsetStart];}}

最终做出来的 dynamicOffsets 会被提供给 vkCmdBindDescriptorSets

vkCmdBindDescriptorSets 是逐物体的,因为绘制命令是逐物体的

perObjectIndexes

这里用一个 perObjectIndexes 来存储这一帧的物体的数量

看上去不必要用 vector,直接用一个 int 就好了

类似他有一个 int32 offsetStart = objIndex * dynamicOffsetCount; 就很精炼

提取出了第 i 个物体的

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git分支提交时自动大写 fatal: the remote end hung up unexpectedly

先说结论&#xff1a; 进入 .git/refs/heads目录&#xff0c;会看到Feature文件夹&#xff0c;重命名为feature即可。 表现&#xff1a; 通过终端命令创建的分支 git checkout -b feature/name 使用git push后自动变成了Feature/name 并且有时候在本地创建feature/1234567…

合宙4G模块Air724UG调试过程(短信发送、上传数据到华为云IOT)

合宙Air724UG-4G模块AT指令调试接线演示 一、前言 上海合宙Air724UG模块是一款高性能的4G Cat.1通信模组(全网通模块,支持移动、联通、电信,支持短信和网络通信),为开发者提供了丰富的接口和开发方式。 在本文中,将详述调试与集成该模块的关键步骤: (1)从基础硬件配…

vim脚本的语言语法

本文结构&#xff1a; a、简介 b、Vim 脚本语言的一些基本语法和概念 a、Vim 脚本语言&#xff08;Vimscript&#xff09;是 Vim 编辑器用于自动化任务和扩展功能的脚本语言。Vimscript 提供了一套丰富的命令、函数和变量&#xff0c;允许用户自定义快捷键、映射、插件和更多…

CSS面试题常用知识day03

大家好我是没钱的君子下流坯&#xff0c;用自己的话解释自己的知识 前端行业下坡路&#xff0c;甚至可说前端已死&#xff0c;我还想在前段行业在干下去&#xff0c;所以从新开始储备自己的知识。 从CSS——>Javascript——>VUE2——>Vuex、VueRouter、webpack——>…

SVM简介 详细推导 核函数 线性可分 非线性可分

注意&#xff1a;由于该文章由jupyter nbconvert导出&#xff0c;若单独执行代码可能出现变量找不到或者没有导入库的情况&#xff0c;正确的做法是将所有的代码片段按顺序放到一个.py文件里面或者按顺序放入一个.ipynb文件的多个代码块中。 SVM(Support Vector Machine) Vap…

49岁前港姐退圈出嫁「南丫岛王子」,打排卵针高龄连生两女。

现年49岁的吴忻熹&#xff08;原名吴文忻&#xff09;1998年参选香港小姐夺得季军入行&#xff0c;在TVB签约发展平平&#xff0c;继而转战影坛&#xff0c;凭性感演出而为人熟悉。其后她在2011年嫁给有「南丫岛王子」之称的金融才俊&#xff0c;并在近40岁开始诞下两名女儿。吴…

Git 多人协作开发

文章目录 项目/仓库名称修订历史项目说明书代码工作流程项目/仓库名称 任务名称: 任务描述: 任务优先级:1(1最优先) 周期:10ms和1ms README.md为markdown语言编写的文件,可使用typora软件进行读写。 修订历史 版本时间更新说明修订者V0.12023/10/27base版本项目说明书…

python爬虫+django新闻推荐系统可视化分析

1. 安装python3.7.0 2. 更新pip 控制台执行 python -m pip install -U pip 3. 安装依赖库 pip install -r requirements.txt 4. 更改mysql数据库配置 修改newsServer/settings.py中的数据库连接配置&#xff0c;比如修改下方PASSWORD密码为本机mysql密码&#xff1…

浏览器工作原理与实践--WebAPI:XMLHttpRequest是怎么实现的

在上一篇文章中我们介绍了setTimeout是如何结合渲染进程的循环系统工作的&#xff0c;那本篇文章我们就继续介绍另外一种类型的WebAPI——XMLHttpRequest。 自从网页中引入了JavaScript&#xff0c;我们就可以操作DOM树中任意一个节点&#xff0c;例如隐藏/显示节点、改变颜色、…

Ps:HDR 色调

HDR 技术旨在通过合并不同曝光度的图像来扩展照片的光照细节范围&#xff0c;使得最终图像能够同时展示最亮和最暗区域的细节。 HDR 色调 HDR Toning命令能够在单张图像上重现类似的效果&#xff0c;无需多张不同曝光的照片。 Ps菜单&#xff1a;图像/调整/HDR 色调 Adjustment…

物联网实战--入门篇之(十)安卓QT--后端开发

目录 一、项目配置 二、MQTT连接 三、数据解析 四、数据更新 五、数据发送 六、指令下发 一、项目配置 按常规新建一个Quick空项目后&#xff0c;我们需要对项目内容稍微改造、规划下。 首先根据我们的需要在.pro文件内添加必要的模块&#xff0c;其中quick就是qml了&…

Windows下编译TinyXML(XML文件解析)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 TinyXML是什么&#xff1f; TinyXML是一个轻量级的C XML解析器&#xff0c;它提供了一种简单的方法来解析和操作XML文档。TinyXM…

【六 (2)机器学习-机器学习建模步骤/kaggle房价回归实战】

一、确定问题和目标&#xff1a; 1、业务需求分析&#xff1a; 与业务团队或相关利益方进行深入沟通&#xff0c;了解他们的需求和期望。 分析业务流程&#xff0c;找出可能的瓶颈、机会或挑战。 思考机器学习如何帮助解决这些问题或实现业务目标。 2、问题定义&#xff1a;…

docker搭建CI/CD环境配置过程中的常见问题

一、Jenkins 1、pull镜像问题 docker pull jenkins/jenkins:lts Using default tag: latest Trying to pull repository docker.io/library/centos ... Get https://registry-1.docker.io/v2/library/centos/manifests/latest: Get https://auth.docker.io/token?scoperepo…

激发创新活力:算力券与模型券,科技企业的新动力

激发创新活力&#xff1a;算力券与模型券&#xff0c;科技企业的新动力 在数字化转型的大潮中&#xff0c;科技创新已成为推动企业发展的核心动力。为了进一步激发企业的创新活力&#xff0c;政府和相关机构开始探索一种新的激励机制——发放“算力券”和“模型券”。这些创新…

golang语言系列:Web框架+路由 之 Echo

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是golang语言系列文章&#xff0c;本篇主要对 Echo 框架 的基本使用方法 进行学习 1.Echo是什么 Go 有众多Web框架&#xff0c;Echo 是其中的一个&#xff0c;官网介绍Echo有高性能、可扩展性、极简的特点。使用E…

非关系型数据库-----------探索 Redis高可用 与持久化

目录 一、Redis 高可用 1.1什么是高可用 1.2Redis的高可用技术 二、 Redis 持久化 2.1持久化的功能 2.2Redis 提供两种方式进行持久化 三、Redis 持久化之----------RDB 3.1触发条件 3.1.1手动触发 3.1.2自动触发 3.1.3其他自动触发机制 3.2执行流程 3.3启动时加载…

将excel数据拆分成多个excel文件

一、背景&#xff1a; 平时在日常工作中&#xff0c;经常需要将excel的文件数据进行拆分&#xff0c;拆分成多个excel文件&#xff0c;然而用人工来处理这个既耗时&#xff0c;又费精力&#xff0c;眼睛会疲劳&#xff0c;时间长了操作上会出现失误&#xff0c;导致数据拆分错…

Redis缓存设计与性能优化【缓存和数据库不一致问题,解决方案:1.加过期时间这样可以一段时间后自动刷新 2.分布式的读写锁】

Redis缓存设计与性能优化 缓存与数据库双写不一致 缓存与数据库双写不一致 在大并发下&#xff0c;同时操作数据库与缓存会存在数据不一致性问题 1、双写不一致情况 2、读写并发不一致 解决方案&#xff1a; 1、对于并发几率很小的数据(如个人维度的订单数据、用户数据等)&a…

Training language models to follow instructions with human feedback

Abstract 使语言模型变得更大并不意味着它们本身就能更好地遵循用户的意图。模型的输出结果可能存在以下问题 不真实有毒对用户没有帮助即这些模型没有和用户 “对齐”(aligned) 在给定的 Prompt 分布上,1.3B 的 InstructGPT 的输出比 175B GPT-3 的输出更好(尽管参数量相…