这篇文章开始展开介绍工程的组织方式和组件模块。首先从vulkan组件开始。大部分文章都是把官网例子重复一遍,或是罗列接口说明,根本不足以用在生产环境。

注意,文章主要表述组件的功能和要点,和它们之间的关联配合,并不会大面积的罗列代码,如果想参考源码,可以直接拉取仓库查看。

仓库:https://bitbucket.org/mm_longcheng/mm-vulkan

扣扣交流群:554329899

我们的接口需要做到哪些功能:
1.vulkan运行时环境的启动和关闭。
2.与原生os层接口交互,创建并桥接View和surface。
3.我们需要配置文件,图片,模型等资源。

组件需要满足的特性:
1.basis硬件纹理压缩
2.draco模型数据压缩
3.常用图片格式加载
4.图集打包功能
5.跨平台支持,windows,android,ios,macos

一、主要部件,渲染器

struct mmVKRenderer
{struct mmVKInstance vInstance;struct mmVKPhysicalDevice vPhysicalDevice;struct mmVKDevice vDevice;struct mmVKUploader vUploader;VkCommandPool graphicsCmdPool;VkCommandPool transferCmdPool;VmaAllocator vmaAllocator;uint32_t vApiVersion;uint32_t vAppVersion;const VkAllocationCallbacks* pAllocator;
};

里面有两个仅需配置但很少引用的类型:

一个是mmVKInstance,详情可以看源码,其中比较重要的是需要在构建mmVKInstance时视情况开启验证层,并且将日志接入我的logger系统,因为在安卓上日志接口会不太一样,抽象logger是必要的。

一个是mmVKPhysicalDevice。构建要点是需要以某种方式挑选一个缺省的设备,我是按独显优先,显存大的优先挑的第一个,并且支持传入设备索引由应用层挑选。另外,我需要支持硬件纹理压缩basis,所以需要按设备得到支持的压缩纹理格式。

mmVKDevice是用的比较多的部件,这部分的工作主要是挑选队列,筛选需要支持图形和呈现(推到交换琏)。然后获取并缓存了交换琏的的接口函数。

mmVKUploader是从ktx-software里面抄的,主要提供将ktx贴图资源上传到vulkan抵达硬件的功能。贴图资源是一个大模块,我使用了两个系列的第三方库,一个是FreeImage,一个就是ktx。

FreeImage主要提供常用格式图片文件的加载,比如png、jpeg、webp、tiff等。它依赖了比较多的图片解码库,主要工作是给这些第三方库搭建多平台编译工程,这部分留到mm-libx仓库再说。

ktx是一个vulkan,opengl官方推荐使用的纹理数据容器格式,除了将编码后的图片资源打包,还会将渲染api常用的参数作为元数据打包。还有比较重要的是,新版本还提供了basis(basis_universal)硬件纹理压缩方案。并且内部携带一份vulkan的图片资源上载的组件。真的是非常的省心了。单是不能直接拿来使用,需要原样复制一份,然后将image和buffer的创建接口改成英伟达开源的vma。注意需要合并一下最新的版本改动,我用的时候发现当前master版本(4.0.0)有内存泄露。

VmaAllocator是英伟达开源的vma资源管理库主要部件。它会把小块分配需求合并,并且按块整合申请,虽然是c++写的,体积有点大,但好在它的接口是c接口。并且十分好用。

二、主要部件,资源

struct mmVKAssets
{struct mmPackageAssets* pPackageAssets;struct mmFileContext* pFileContext;struct mmVKUploader* pUploader;struct mmVKDevice* pDevice;struct mmVKPipelineCache vPipelineCache;struct mmVKSamplerPool vSamplerPool;struct mmVKSheetLoader vSheetLoader;struct mmVKImageLoader vImageLoader;struct mmVKShaderLoader vShaderLoader;struct mmVKLayoutLoader vLayoutLoader;struct mmVKPassLoader vPassLoader;struct mmVKPipelineLoader vPipelineLoader;struct mmVKPoolLoader vPoolLoader;struct mmVKAssetsDefault vAssetsDefault;
};

mmPackageAssets是一个跨平台的部件,它会分平台地得到可用的读写路径,这部分在ios和安卓平台尤其重要。我们需要保存PipelineCache的缓存二进制文件,需要这个部件。

mmFileContext是一份既可读取目录,也可以读取zip压缩包,并且可以加搜索路径的文件读取组件。fopen并不总是可用的,这一点在安卓上尤其如此。实际上所有的随包资源都是用它来读取。

mmVKPipelineCache是个简单的管线存储和加载的部件。

mmVKSamplerPool是采样器的池,考虑到很多情况下采样器参数基本一致,那么对于使用同一参数创建的采样器,循环利用是廉价的。

mmVKSheetLoader是图集打包资源的加载器。ui图集会通过TexturePackage打包,并且输出一份类tsv的文本数据。加载图集描述文件需要这个部件。

mmVKImageLoader是图片资源的加载和上传到vulkan接口的管理器,它整合了FreeImage和ktx的接口,提供了简单的按文件路径加载的接口。

mmVKShaderLoader是spv着色器资源的加载器。

mmVKLayoutLoader是VkDescriptorSetBinds的配置文件加载器,我用json来描述描述符集绑定布局。加载完毕后可以使用名称索引它。

mmVKPassLoader是RenderPass的配置加载器,由于现在只有使用交换链来创建的一份pass,所以实际上它还没有相应的json配置格式。但是它能使用名称索引这份资源,为Pipeline的json配置提供了前提条件。

mmVKPipelineLoader是使用描述符集布局,着色器,RenderPass,和着色器入参来描述的资源,它也使用json格式描述。

mmVKPoolLoader是VkDescriptorSet描述符集的池子加载器,它会使用Layout作为布局初始化按特定大小的描述符池的分组,当一个分组分配完会创建新的分组。简单扩容。

mmVKAssetsDefault会创建几份默认的图片资源,比如全白和透明图片,用于特定情况。

三、主要部件,交换琏和视图

mmVKSurface和mmVKSwapchain并不在Renderer里,而是平级的关系。因为通常一个系统里只有一个Renderer,但可能会有多个窗口,一个窗口一份Surface和其配套的Swapchain。

这部分是由nwsi系统完成的。它相当于glfw库,它是嵌入式非强占的设计,更轻量和特化,并且支持安卓和ios。我们以os原生接口创建app和主view。并将这个主视图通过对应平台的Surface部件桥接,最后得到一份交换琏。

特别说一下我是如何支持多平台的。

首先我创建os目录,并在这个目录下创建不同平台的文件夹。把平台相关的实现分开放入,在编译时通过包含特定目录来将物理上不在一起的文件夹合并为逻辑上在一块。这样就无需写平台宏来区分代码块,保证了源码的清晰和整洁。

四、主要部件,管线渲染对象

mmVKPipelineTarget主要维护了渲染缓冲区的资源framebuffer。它也是独立于渲染器存在的,并且它不属于交换琏。这样做有很多好处。比如隶属于同一RenderPass的多个管线可以将结果渲染到一起。是渲染结果的承载对象,并且维护了每帧的主级别CommandBuffer,也维护了将cmd推送到设备队列并做切帧的功能。

五、主要部件,gltf加载器

mmVKTFModel,主要维护了gltf的静态资源,如图片,定点数据缓冲区,定点数据缓冲区等,但不包含动态数据,如动画状态数据是没有的。

mmVKTFObject,主要维护了gltf更新时产生的动态数据,模型动画的状态会保存在这里。一份TFModel可以创建多个TFObject,这样可以复用静态数据资源。

目前gltf的部分还不完善,仅支持特定顶点参数格式。并且仅提供了一份基本款的pbr着色。但好在可以与blender导出插件配合工作,并且优先支持了模型骨骼动画,有一定的可用性。可以满足基本需求。

六、次要部件和工具

mmVKDebugger是挂载在vulkan实例上的日志输出回调处理组件。

mmVKCamera仅保存了投影矩阵的视图矩阵,是相机的数据。

mmVKUniformType用来构建ubo数据布局,我们需要特定的对齐方式来保证传入着色器数据的正确性。

mmVKNode是场景节点位置信息和节点关联信息的数据。

mmVKJSON是json文件解析为vulkan结构的转换解码部件。

mmVKCommandBuffer是命令记录相关的部件,包含常用的辅助记录命令函数。

用vulkan写个引擎 (二)vk组件相关推荐

  1. 用vulkan写个引擎 (三)ui组件

    ui组件也许是最令人着迷的部分.这部分最复杂的要数文字排版系统,比较重要的部分分别是属性集部件,信号槽部件,布局系统.相对复杂的部分是图片顶点数据拼装,和系统事件处理. 仓库:https://bitb ...

  2. 用vulkan写个引擎 (一)综述

    https://zhuanlan.zhihu.com/p/466830308 自己写个游戏引擎,这是个有趣的工程实践,vulkan的设备覆盖率已经非常高了.android 7.0以上的设备占比75%左 ...

  3. 用vulkan写个引擎 (四)PBR着色器

    PBR全称(Physicallly-Based Rendering),基于物理的渲染.本文将提供一份GLSL实用型着色器.对于理论部分网络上已经有太多文章了. 仓库:https://bitbucket ...

  4. Vue源码之mustache模板引擎(二) 手写实现mustache

    Vue源码之mustache模板引擎(二) 手写实现mustache mustache.js 个人练习结果仓库(持续更新):Vue源码解析 webpack配置 可以参考之前的笔记Webpack笔记 安 ...

  5. React学习二(组件详解)

    文章目录 一.React数据流 二.组件的特性 1.属性(props) (1)React Props默认值与标签属性限制 (2)应用-React组件切分与提取 2.状态(state) (1)state ...

  6. windows脚本编制引擎_手把手教你写脚本引擎(一)

    手把手教你写脚本引擎(一)--挑选语言的特性 陈梓瀚 华南理工大学软件本科05级 脚本引擎的作用在于增强程序的可配置性.从游戏到管理系统都需要脚本,甚至连工业级产品的Office.3DS Max以及A ...

  7. Vue学习笔记(二)组件化和模块化

    Vue学习笔记(二)组件化和模块化 前言 组件化 什么是组件化 1.基础使用 2.全局组件和局部组件 3.语法糖和模板抽离 4.组件的data为什么是函数 5.父子组件 5.1 父子组件 5.2 父子 ...

  8. 在OpenCV环境下写的灰度图像二维傅里叶换,幅值计算,频谱平移和将数值归一化到0到255区间的四个函数

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 灰度图像的二维傅里叶变换(cv_gray_fft ...

  9. SpringBatch顺序读取多文件(MultiResourceItemReader)和顺序写文件(MultiResourceItemWriter)(二)

    文章目录 一.抽取顺序读取多文件公共reader 二.抽取写文件公共基于MultiResourceItemWriter 三.实现自己的ResourceSuffixCreator 四.读取多文件job ...

最新文章

  1. e2fsprogs制作嵌入式 mkfs.ext2 mkfs.ext3 mkfs.ext4
  2. 数据分析与挖掘实战-中医证型关联规则挖掘
  3. 浅谈SAP Cloud for Sales 自动化
  4. obj.href 与 obj.getAttribute(href)的区别
  5. B 树,B- 树,B+ 树,B* 树
  6. 基于CNN实现对摄像头捕捉的人脸进行性别和年龄的预测
  7. 计算机网卡的总线接口分类有,网卡的详细分类是怎样的?以太网卡有将高层数据转换为比特流的功能吗?...
  8. Python实现学生成绩分析
  9. 在Android Studio上编写第一个安卓程序
  10. 用axure做产品需求文档
  11. 群贤路附近哪有计算机学校,群贤路口附近展览馆、会展中心
  12. APP开发从需求到产品—APP产品经理成长日记
  13. hadoop混搭_混搭:Web应用程序的新品种
  14. 情人节 礼物TOP10
  15. Spring MVC 参数校验
  16. opencvjs 磨皮美颜
  17. ajax入门学习(一)
  18. 【软件工程】实验4:校园二手物品交易过程的UI设计
  19. 基于微信小程序的旅游网站
  20. 在vue、html中手动写日期格式化转换为“yyyy-MM-dd hh:mm:ss”

热门文章

  1. 新手树莓派3B——人脸识别门禁管理系统
  2. WebComponents.exe未安装的解决办法
  3. EasyNVR更新版本后如何同步RTSP通道?
  4. lol1月8日服务器维护,LOL1月16日更新维护公告 LOL8.1新版本更新到几点
  5. Jetson Nano CSI相机驱动调试注意
  6. python工程监理_1.工程监理招标属于()
  7. 性能测试报告模板 V1.0
  8. npm 卡住 type-fest@^0.20.2 问题解决
  9. 浅谈Linux下各种压缩 解压命令和压缩比率对比
  10. dbus系列教程(2)理解dbus核心概念