前言

距离上一次认真写一点东西,又过了1年之久,深感自己拖延症愈加严重,每次定好的计划总是无法做到真正的执行,这期间也可以给自己找个借口,那就是工作很忙,但也有大部分原因是因为感觉自己经验尚浅,想着要后面会不会推翻当下的方案,后面就是不知道从哪开始记录了,最后就进入了焦虑 -> 躺平 -> 焦虑的恶性循环。

但定好的目标总是要开始的,所以这次我决定不制定过于久远的计划:实现一个基于Vulkan的渲染引擎。其实在此之前,我大约花了3-4个月的业余时间,使用OpenGL实现了一个版本的渲染器(下文有截图),但因OpenGL在安卓端使用时需要转换为OpenGLES的原因,暂时没有往下写。也因为Vulkan自带的平台无关性、多线程原生支持等特性,决定采用Vulkan也实现一个渲染框架,并将每一步实现都用博客记录并录制视频。

虽然该框架目前做的大部分工作属于渲染,但后期可能也会添加一些额外功能,比如复杂的编辑器、声音管理,又或者是基于该框架做一些小演示、小游戏等。所以我还是将此工程命名为AdiosyEngine

我的主页:Learn_Vulkan02_渲染框架实现_开篇

该工程的源码管理地址:https://gitee.com/xingchen0085/adiosy_engine

另外,我计划将这一项目实现都录制视频记录下来,这是我的小破站地址:XINGCHEN0085,如果感兴趣可以关注一下。

功能概览

  • 支持Windows、Macos和Linux三个PC平台运行。

  • Vulkan基本图元渲染,包括:点、线、面和三维物体。

  • 物体点击选中。

  • 贴图和材质的渲染。

  • Phong光照模型,法线贴图、天空盒。

  • 简单阴影。

  • 场景图ECS系统、场景保存和加载。

  • obj和glTF模型导入。

  • 蒙皮动画。

  • 场景编辑器。

TODO list:

  • PBR、HDR、泛光和后处理等效果。
  • 添加是适配安卓平台。

以下几张程序运行截屏:

image-20240407170034961

截图 2024-03-06 01-38-10

截屏2023-11-24 03.14.21

该库实现了一个简单编辑器,由程序运行情况面板(“Application”)、场景节点布局(“Layout”)、场景节点属性(“Property”)和资源管理(“content”)四部分构成。

  1. 程序运行情况:记录键、鼠和其他事件,并提供一些性能指标显示,包括顶点数量、三角形数量、资源池占用等。

  2. 场景节点布局:也就是场景树,基础结构如下:

    image-20240409165421170

    • 上述节点中,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系统中详细设计和实现。

    1. 场景节点属性:第2步骤中的各节点详细属性,包括每个Object拥有的所有组件属性。
    2. 资源管理: 模型、贴图、材质、场景和配置文件等资源文件管理。

开发计划

  • 工程基本结构设计和搭建;

    • 导入Vulkan;
    • 第三方库导入: glfw和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
  • 蒙皮动画;

  • 场景编辑器;

  • 场景保存和载入。

项目架构

image-20240408094442623

三层架构简述:

  • 平台层,提供不同平台的差异化实现,包括在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

参考

Redcamellia/ChernoHazel: Hazel Engine

Games104: Piccolo Engine