Learn_Vulkan02_渲染框架实现_开篇
距离上一次认真写一点东西,又过了1年之久,深感自己拖延症愈加严重,每次定好的计划总是无法做到真正的执行,这期间也可以给自己找个借口,那就是工作很忙,但也有大部分原因是因为感觉自己经验尚浅,想着要后面会不会推翻当下的方案,后面就是不知道从哪开始记录了,最后就进入了焦虑 -> 躺平 -> 焦虑的恶性循环。
但定好的目标总是要开始的,所以这次我决定不制定过于久远的计划:实现一个基于Vulkan的渲染引擎。其实在此之前,我大约花了3-4个月的业余时间,使用OpenGL实现了一个版本的渲染器(下文有截图),但因OpenGL在安卓端使用时需要转换为OpenGLES的原因,暂时没有往下写。也因为Vulkan自带的平台无关性、多线程原生支持等特性,决定采用Vulkan也实现一个渲染框架,并将每一步实现都用博客记录并录制视频。
虽然该框架目前做的大部分工作属于渲染,但后期可能也会添加一些额外功能,比如复杂的编辑器、声音管理,又或者是基于该框架做一些小演示、小游戏等。所以我还是将此工程命名为AdiosyEngine。
该工程的源码管理地址:https://gitee.com/xingchen0085/adiosy_engine
另外,我计划将这一项目实现都录制视频记录下来,这是我的小破站地址:XINGCHEN0085,如果感兴趣可以关注一下。
功能概览
-
支持Windows、Macos和Linux三个PC平台运行。
-
Vulkan基本图元渲染,包括:点、线、面和三维物体。
-
物体点击选中。
-
贴图和材质的渲染。
-
Phong光照模型,法线贴图、天空盒。
-
简单阴影。
-
场景图ECS系统、场景保存和加载。
-
obj和glTF模型导入。
-
蒙皮动画。
-
场景编辑器。
TODO list:
- PBR、HDR、泛光和后处理等效果。
- 添加是适配安卓平台。
- …
以下几张程序运行截屏:
该库实现了一个简单编辑器,由程序运行情况面板(“Application”)、场景节点布局(“Layout”)、场景节点属性(“Property”)和资源管理(“content”)四部分构成。
-
程序运行情况:记录键、鼠和其他事件,并提供一些性能指标显示,包括顶点数量、三角形数量、资源池占用等。
-
场景节点布局:也就是场景树,基础结构如下:
-
上述节点中,Scene、Object和Mesh都属于
Node
类型,拥有自身的局部变换和子节点列表。每次更新一个Node的时候,都会更新这个节点的父节点。 -
Scene表示一个场景,也可以将附加上其他子Scene,可以拥有多个Object节点。
-
每个Object表示一个物体,可以附加上其他子Object,可以拥有多个Mesh节点,Mesh节点可能来自模型导入或自定义顶点。但只能拥有一个Material节点。
-
每个Mesh表示一个网格,可以拥有多个Skeleton节点,并且可以拥有1个Material Instance节点,如果这个Material Instance不存在,则默认使用Object的Material。
-
每个Skeleton表示一个骨骼,可以拥有多个Animation节点。
后续在ECS系统中详细设计和实现。
- 场景节点属性:第2步骤中的各节点详细属性,包括每个Object拥有的所有组件属性。
- 资源管理: 模型、贴图、材质、场景和配置文件等资源文件管理。
-
开发计划
-
工程基本结构设计和搭建;
- 导入Vulkan;
- 第三方库导入: glfw、ImGui和spdlog
- 程序入口
- GLFWWindow
- ImGui
- 事件通知
-
使用Vulkan绘制二维图元;
- Vulkan Render Context: VkInstance,VkSurface,VkDevice,VkQueue,VkSwapchain初始化;
- Vulkan Render Pass: VkRenderPass,VkFramebuffer初始化;
- Vulkan Reource: VkShaderModule,VkPipeline,VkBuffer,VkDesriptorSet,VkCommandBuffer初始化;
- Render Loop设计;
-
绘制三维物体;
- 第三方库导入:glm
- 立方体;
- 其他:圆、球体、圆锥、圆柱和平面;
-
围绕物体的相机;
- AroundTarget Camera,根据按键和鼠标实现旋转。
-
贴图绘制;
- 第三方库导入:stb_image
-
点击选中功能;
-
简单编辑器;
-
ECS场景图;
- 第三方库导入: entt
-
材质;
-
Phong光照模型;
-
反射贴图/天空盒;
-
法线贴图;
-
简单阴影实现;
-
obj和glTF导入实现;
- 第三方库导入: tiny_obj_loader
-
蒙皮动画;
-
场景编辑器;
-
场景保存和载入。
项目架构
三层架构简述:
- 平台层,提供不同平台的差异化实现,包括在Windows、Macos和Linux三个PC平台的实现;另外对图形API(OpenGL、Vulkan…),提供上层窗口系统和Gui支持。
- 核心层,这一层包括一些公共工具、事件处理、配置和渲染、动画和场景管理几个模块。
- 应用层,简单实现一个场景编辑器,还有使用的sample,sandbox等。
初始代码结构
.
├── CMakeLists.txt
├── Core
│ ├── CMakeLists.txt
│ ├── Private
│ └── Public
├── Editor
│ ├── CMakeLists.txt
│ ├── Private
│ └── Public
├── Platform
│ ├── CMakeLists.txt
│ ├── Private
│ └── Public
└── Sample
├── 00_SandBox
└── CMakeLists.txt
参考
- Author: xingchen
- Link: http://www.adiosy.com/posts/learn_vulkan/learn_vulkan02_%E6%B8%B2%E6%9F%93%E6%A1%86%E6%9E%B6%E5%AE%9E%E7%8E%B0_%E5%BC%80%E7%AF%87.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.