Awesome
Turbo
Turbo是渲染引擎
Platform
Version
当前版本 0.0.0.12
State
- 研究开发
Vulkan
硬件实时光追。 - 研究开发
C/C++
开发WebGPU
项目,并发布到浏览器页面中。./sample
下新增PureCCppWebGPUTest
项目,详细信息请参考 WebGPU : C/C++ 文档。./sample
下新增PureCCppMiniWebGPUTest
项目。
Sponsor
想赞助的小伙伴,欢迎使用爱发电
赞助,请量力而为,如果赞助完真有困难可以退回,未成年人禁止投喂!!!
赞助项目
- 体积云教程:详情请阅览
./docs/VolumetricCloud.md
(进行中)<研究光照散射中>
Document
- 相关文档现在可以在Vulkan入门精要中查阅。比如Vulkan KHR 光线追踪标准。
- 详细设计文档请参考
docs/TurboDesign.drawio
(需要安装drawwio
) - 目前存在的问题待解决,请查看
docs/Issue.md
- 开发记录录像请浏览 Turbo引擎开发记录
Modular
目前Turbo
中有以下模块
- 命名空间:
Turbo::Core
- 文档:
./docs/TurboDesign.drawio:Core
和Core.md - 目录:
./engine/core
- 依赖:独立模块,无依赖。
- 说明:
Core
作为核心模块直接与Vulkan
沟通,是上层与Vulkan
底层最直接的桥梁,Turbo
中所有的GPU
相关工作最终都会从上层回到Core
层。
- 命名空间:
Turbo::FrameGraph
- 文档:
./docs/TurboDesign.drawio:FrameGraph
和FrameGraph.md - 目录:
./engine/framegraph
- 依赖:独立模块,无依赖。
- 说明:
FrameGraph
用于描述一帧中的资源、渲染配置和渲染指令
- 命名空间:
Turbo::Render
- 文档:FrameGraphAdvance.md
- 目录:
./engine/render
- 依赖:
Core
和FrameGraph
。 - 说明:由于直接使用
Core
层进行渲染相对来说还是会比较繁琐吃力一些,Render
模块的出现就是将Core
和FrameGraph
结合起来,提供更加方便的工作流,将开发者从繁杂的Core
层脱离出来,提供更加简单易用的设计架构
Clone
git clone --recursive git@github.com:FuXiii/Turbo.git
Build
-
首先您需要知道的:
-
Turbo
目前主要有两个分支:master
和dev
。其中master
是主分支,确保可以正常编译和使用,而dev
分支会经常开发新功能,想看开发推进的可以查看dev
分支,但不保证能够正常编译。 -
Turbo
引擎被设计成各种模块,有Core
核心模块, 有FrameGraph
模块等。 -
目前
Turbo
的核心模块基本完成(未完成部分和相关问题请参考下面的RoadMap
章节和docs/Issue.md
文档) -
Turbo
引擎的核心位于./engine/core
,这是一个单独的模块,您可以直接将他拷贝出来放到自己的工程中 -
Turbo
引擎会使用核心进行渲染,有关如何使用该核心,目前可以参考./main.cpp
和./samples
文件夹下各个示例。该文件中有最新的核心实例代码,同时也是引擎的一部分。 -
核心会用到的第三方库为:
glslang
: 用于将Shader
代码字符串编译成Spir-V
SPIRV-Cross
: 用于解析Spir-V
,获取Shader
中相关声明VulkanMemoryAllocator
: 用于分配Vulkan
资源内存
-
本人对于CMake
并不是非常精通,有关核心是如何寻找Vulkan
库的,我直接配置的绝对路径,请修改engine/core/CMakeLists.txt
中的此行代码:#已遗弃 ##set_target_properties(vulkan PROPERTIES IMPORTED_LOCATION F:/VulkanSDK/1.3.204.1/Lib/vulkan-1.lib)
请将该行修改成您电脑上的Vulkan
库目录。 该问题将会在不远的未来通过动态加载库文件得到解决。┗|`O′|┛oO 2022/7/27 该问题已修改完成,详情请参考下面的
如何编译Turbo
章节的注
-
Turbo
非核心模块,也就是目前除了./engine/core
之外,基本上就是Turbo
的非核心了,之后将在核心之外,基于核心开发高级模块,比如FrameGraph
之类的,目前非核心模块已有核心模块使用案例,位于./main.cpp
和./samples
文件夹下,就像前面说的,用例使用如下第三方库:glfw
:窗口库glm
: 用于向量矩阵等运算imgui
: 用于绘制界面UIKTX-Software
:Khronos Texture
通用纹理标准tinygltf
: 读取gltf
文件库
-
-
如何编译
Turbo
-
请安装Vulkan SDK
- ( *注:2022/7/27 对于
Windows
系统,目前Turbo
已经完成了动态加载Vulkan
函数,(有些第三方依赖需要Vulkan SDK
目前对于Turbo
不是必需品Vulkan SDK
,比如VulkanMemoryAllocator
),Vulkan
的Runtime
是Turbo
的必须品,正常Windows
都会自带该运行时库,如果没有请安装Vulkan Latest Runtime即可,(2022/11/14Linux
系统等有空适配一下Linux
适配完成))Vulkan Loader 文档有这么一句: In previous versions of the loader, it was possible to statically link the loader. This was removed and is no longer possible. The decision to remove static linking was because of changes to the driver which made older applications that statically linked unable to find newer drivers.
- ( *注:2022/7/27 对于
-
Turbo
的核心可以单独编译,编译相关的CMakeLists.txt
位于./engine/core/CMakeLists.txt
。将会输出名为TCore
的库文件。- 2023/9/21 添加了
TCORE_SHARED_LIBS
的CMake
选项。用于配置是否输出TCore
的动态库。默认情况下为OFF
,也就是输出静态库,如果想输出动态库请设置为ON
。
- 2023/9/21 添加了
-
如果您想直接编译
Turbo
-
首先请查看环境变量中是否已经加入了
git
的bin
目录,KTX-Sofware
编译依赖bash.exe
,正常该程序位于git
的bin
目录下 -
请安装
python
。第三方库很多CMake
使用Python
脚本运行,安装完后请确保Python
的{Python的安装目录}/Python{版本号}/
目录和{Python的安装目录}/Python{版本号}/Scripts
目录加入到了环境变量中 -
请修改engine/core/CMakeLists.txt
中的Vulkan
库目录为您自己的目录 -
之后使用
./CMakeLists.txt
即可 -
设置相关
CMake
参数如下:KTX_FEATURE_LOADTEST_APPS=OFF//如果您想加载KTX测试,请设置ON KTX_FEATURE_DOC=OFF//如果您想生成KTX文档,请设置ON KTX_FEATURE_STATIC_LIBRARY=ON //目前Turbo按照静态库使用KTX //2022/7/30 关于解决Turbo核心库的依赖库问题解决,核心库对于VulkanMemoryAllocator使用动态加载Vulkan API方式,这也是Turbo引擎加载Vulkan API的方式 VMA_STATIC_VULKAN_FUNCTIONS=OFF VMA_DYNAMIC_VULKAN_FUNCTIONS=ON TCORE_SHARED_LIBS=ON //2023/9/21 Turbo的核心库输出为动态库,如果想输出为静态库请设置为OFF
-
注:如果编译有遇到问题请查看
常见问题文档
如果还是没有解决方法请提Issue
-
-
如何运行
- 由于每个用户输出的目录都不一样,所以
./main.cpp
的示例程序使用的资源文件使用的是相对路径,所有的资源文件都指向./asset/
目录,请在./main.cpp
中全局搜索asset
字符,替换成自己的目录即可。
注:如果运行有遇到问题请查看
常见问题文档
如果还是没有解决方法请提Issue
- 由于每个用户输出的目录都不一样,所以
Trifles
- 整理一下头文件,有点乱,去掉不必要的头文件
RoadMap
注:该RoadMap
章节信息有滞后性,引擎具体细节和开发计划请查看后面的开发Log
章节(更新的比较频繁)
2022/5/15
Turbo
引擎对于Vulkan 1.0
的相关核心功能已初步成型,由于Vulkan
本身的复杂性还有很多特性没有实现,在此做一下记录,记录该引擎以实现的特性和未来计划实现特性,该特性记录将会和docs/Issue.md
文档配合使用。Core
核心层将会作为单独完整的库发布,位于./engine/core
中, 现在核心库已分离成单独的库,将会输出TCore.lib
或TCore.a
库文件Turbo
将使用该Core
核心继续开发高级特性- 未来有时间录制
Vulkan教程
和引擎开发教程
视频
2022/5/28
- 实现完
Vulkan
的input attachment
也就是完成了延迟渲染相关工作,Turbo
核心现在对于图形的核心封装设计基本上接近尾声,延迟渲染之后将会开展FrameGraph
相关设计实现工作。有关几何着色器,细分着色器,光线追踪等将会在Turbo
的核心继续展开FrameGraph
将会是Turbo
引擎实现高级特性的重点,ECS(Entity Component System)
或者EC(Entity Component)
之类管理场景的相关技术不是Turbo
引擎的重点,Turbo
引擎目前的重点目标是不依赖任何窗口库(用户自定义),不依赖任何场景结构技术(用户自己实现自己的场景结构),Turbo
可以很轻松的嵌入其中。
2022/5/30
Turbo
核心基本实现完成,接下来开始FrameGraph
的设计开发。敬请期待。
2022/6/7
- 已开始写系列的使用示例。
2022/8/10
- 开始设计实现
engine
层
已完成示例
HelloTriangle
- 将会使用核心绘制IMGUI
和三角形PureHelloTriangle
- 将会使用核心绘制三角形PureCombinedImageSampler
- 将会使用核心绘制三角形,在此基础上使用纹理采样器一体式
对纹理采样PureSeparateImageSampler
- 将会使用核心绘制三角形,在此基础上使用纹理采样器分离式
对纹理采样PureIndexDraw
- 将会使用核心,基于索引渲染绘制一个方形面片,并在此基础上使用纹理采样器分离式
对纹理采样FrameGraphSample
-FrameGraph
的示例,目前该示例仅供测试(FrameGraph
未实现完成),您可以通过该示例了解FrameGraph
的基本流程
已完成特性
1.Vulkan
核心特性的基本封装,包括:
Turbo::Core::TLayerInfo
-Vulkan
相关验证层信息Turbo::Core::TExtensionInfo
-Vulkan
相关扩展信息Turbo::Core::TVersion
- 通用版本Turbo::Core::TInstance
-VkInstance
的相关封装Turbo::Core::TPhysicalDevice
-VkPhysicalDevice
相关封装Turbo::Core::TDevice
-VkDevice
相关封装Turbo::Core::TDeviceQueue
-VkQueue
相关封装Turbo::Core::TImage
-VkImage
相关封装Turbo::Core::TImageView
-VkImageView
相关封装Turbo::Core::TCommandBufferPool
-VkCommandPool
相关封装Turbo::Core::TCommandBuffer
-VkCommandBuffer
相关封装Turbo::Core::TBuffer
-VkBuffer
相关封装Turbo::Core::TShader
-VkShaderModule
相关封装Turbo::Core::TDescriptorPool
-VkDescriptorPool
相关封装Turbo::Core::TSampler
-VkSampler
相关封装Turbo::Core::TSubpass
-Vulkan
中Subpass
抽象Turbo::Core::TAttachment
-Vulkan
中Attachment
抽象Turbo::Core::TRenderPass
-VkRenderPass
相关封装Turbo::Core::TVertexBinding
-Vulkan
中顶点属性抽象Turbo::Core::TViewport
-Vulkan
中Viewport
抽象Turbo::Core::TScissor
-Vulkan
中Scissor
抽象Turbo::Core::TDescriptor
-Vulkan
中各种描述符抽象Turbo::Core::TDescriptorSetLayout
-VkDescriptorSetLayout
的相关封装Turbo::Core::TPipelineLayout
-VkPipelineLayout
的相关封装Turbo::Core::TPipeline
-TPipelineLayout
的相关封装,内部有VkPipeline vkPipeline
成员变量,但创建是在其子类中创建Turbo::Core::TGraphicsPipeline
- 继承自Turbo::Core::TPipeline
,图形渲染管线VkPipeline
的相关封装,回去创建父类中的Turbo::Core::TPipeline::vkPipeline
Turbo::Core::TDescriptorSet
-VkDescriptorSet
的相关封装Turbo::Core::TPipelineDescriptorSet
- 管线所有有关描述符集的总和抽象,对应多个Turbo::Core::TDescriptorSet
Turbo::Core::TFramebuffer
-VkFramebuffer
相关封装Turbo::Core::TSemaphore
-VkSemaphore
相关封装Turbo::Core::TFence
-VkFence
相关封装Turbo::Extension::TSurface
-VkSurfaceKHR
相关封装Turbo::Extension::TSwapchain
-VkSwapchainKHR
相关封装
计划完成特性
-
Turbo
引擎目前以Core
核心层为主(优先级不分先后)- [ ✓ ] 生成
mipmap
- [ ✓ ] 混合渲染
- [ ✓ ] 天空盒
- HDR(应该算是延迟渲染的一部分)
- [ ✓ ] 实例化渲染
- 间接渲染
- 细分着色器
- 几何着色器
Vulkan
光追标准- 多线程
- [ ✓ ] 计算着色器
- [ ✓ ] 计算管线
- [ ✓ ] 延迟渲染
- [ ✓ ] 生成
-
非
Core
:跨平台窗口层抽象 -
非
Core
:IMGUI
-
非
Core
:KTX
和glTF
-
非
Core
:FrameGraph
层 -
非
Core
:FrameGraph
层实现PBR
-
非
Core
:ECS
层 -
2022/7/13 搞了个
鸿蒙OS(Harmony OS)
系统的手机,有时间适配一下鸿蒙设备。
Log
(2024/12/17) 日志文件转移到了 更新日志