1 Star 2 Fork 3

梁福厚 / MaggotEngine

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

基于Vulkan的引擎底层API封装与渲染案例实现

介绍

框架参考UE4实现内存管理,多线程,RenderGraph引擎底层功能,参考Filament基于Vulkan封装渲染API,GPU资产创建与管理,shader编译反射,imgui绘图,对Vulkan开发流程进行简化,方便快速实现各类算法demo.

运行

  1. 支持 visual studio 2019 win10 64位
  2. clone项目到本地
  3. 资源链接:链接:https://pan.baidu.com/s/1f8sO6hwdEA_uxPfzEt-jiA 提取码:bt73 下载资源Assets.zip,解压到项目目录下的Assets文件夹
  4. 打开MaggotEngine.sln运行案例工程

新建项目

  1. 添加新的控制台项目
  2. C++ Language Stangard 设置为 ISO C++ 17
  3. Additional Include Directories 添加 $(SolutionDir)Maggot 和 $(SolutionDir)ThirdParty\Includes
  4. Additional Library Directories 添加 $(SolutionDir)ThirdParty\Libs
  5. Addition Dependencies 添加静态库 vulkan-1.lib
  6. References 添加项目引用 Maggot

用法

初始化

必须在 mian.cpp 初始化MaggotApp,设置名字,窗口大小,一个场景类,多个渲染进程类. (最后一个渲染进程类必须是CoordinateProcess,用于绘制坐标轴)

int main()
{
    MaggotApp::Get().SetWindowTitle(L"Moggot Engine");
    MaggotApp::Get().SetWindowSize(1600, 900);
    MaggotApp::Get().SetGameScene<LocalScene>();
    MaggotApp::Get().AddRenderProcess<LocalProcess>();
    MaggotApp::Get().AddRenderProcess<CoordinateProcess>();
    MaggotApp::Get().Run();
    return 0;
}

shader注册

项目目录下必须创建 LocalShader.h 与 LocalShader.inl 文件用于注册shader类以及编译shader文件

在 LocalShader.h 下新建shader类,每个shader类必须对应一个glsl文件,必须添加 DECLARE_SHADER_BEGIN 和 DECLARE_SHADER_END 生成注册代码
框架可以通过反射自动获取shader的输入布局,资源绑定布局,也可以使用 SET_INPUT_ASSEMBLY , GROUP_VERTEX_BINGING 等接口自定义设置输入布局以及绘制类型

class LocalVertexShader : public RHIShader
{
	DECLARE_SHADER_BEGIN(LocalVertexShader)
    SET_INPUT_ASSEMBLY(VK_PRIMITIVE_TOPOLOGY_LINE_LIST);
	GROUP_VERTEX_BINGING({ "inPosition", "inNormal" }, VK_VERTEX_INPUT_RATE_VERTEX, sizeof(glm::vec3) * 2);
	GROUP_VERTEX_BINGING({ "inOffset" }, VK_VERTEX_INPUT_RATE_INSTANCE, sizeof(glm::vec3));
	DECLARE_SHADER_END()
};
class LocalFragmentShader : public RHIShader
{
	DECLARE_SHADER_BEGIN(LocalFragmentShader)
	DECLARE_SHADER_END()
};

在 LocalShader.inl 通过 REGISTER_SHADER 绑定shader类与对应的资源文件
必须在 mian.cpp 添加 GlobalShader.inl 和 LocalShader.inl

REGISTER_SHADER(LocalVertexShader, "OitSimple\\Local.vert")
REGISTER_SHADER(LocalFragmentShader, "OitSimple\\Local.frag")

渲染资源通过如下代码构建,资源创建必须通过 ENQUEUE_RENDER_COMMAND 在渲染线程内实现
下面示例某个渲染管线所需渲染资源的创建,不需要自己申请资源池,设置资源布局,框架通过反射完成资源绑定

ENQUEUE_RENDER_COMMAND(BuildModel)([this, ubo](VkCommandBuffer commandBuffer)
    {
        Ubo uboData = ubo;
        // 创建 Ubo
        mUboBuffer = CustomBuffer::Builder()
            .SetData(&uboData)
            .SetSize(sizeof(Ubo))
            .SetMemoryProperty(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)
            .Build();

        // 通过 RHIDescriptor 生成资源池,资源布局
        mDescriptor = RHIDescriptor::Builder()
            .PushShader<LocalVertexShader>()
            .PushShader<LocalFragmentShader>()
            .SetDescriptorCount(0, 1)
            .Build();

        // 可以直接通过 shader 里的资源名字字符串指定资源
        mDescriptor->SetValue("ubo", mUboBuffer);
        mDescriptorMask = mDescriptor->AllocateDescriptor();

        // 创建颜色与深度RenderTarget
        mColorRenderTarget = ColorRenderTarget::Builder()
            .SetUsage(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT)
            .SetStoreOp(VK_ATTACHMENT_STORE_OP_STORE)
            .SetFinalLayout(VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL)
            .Build();

        mDepthRenderTarget = DepthRenderTarget::Builder()
            .Build();

        // 创建 Pipeline RenderPass FrameBuffer
        mPipeline = GraphicsPipeline::Builder()
            .SetDescriptor(mDescriptor)
            .AddColorRenderTarget(mColorRenderTarget)
            .SetDepthRenderTarget(mDepthRenderTarget)
            .SetDstStageMask(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT)
            .SetDstAccessMask(VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT)
            .SetSrcStageMask(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT)
            .SetSrcAccessMask(VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT)
            .Build();

        mRenderPass = RHIRenderPass::Builder()
            .AddRenderTarget(mColorRenderTarget)
            .AddRenderTarget(mDepthRenderTarget)
            .AddPipeline(mPipeline)
            .SetSrcStageMask(VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT)
            .SetSrcAccessMask(VK_ACCESS_SHADER_READ_BIT)
            .SetDstStageMask(VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT)
            .SetDstAccessMask(VK_ACCESS_SHADER_READ_BIT)
            .Build();

        mFrameBuffer = RHIFrameBuffer::Builder()
            .SetRenderPass(mRenderPass)
            .Build();
    });

案例

以下案例基于本框架实现.

示例 说明
img 初始场景
基础场景配置,渲染进程配置,普通纯色与贴图模型渲染,物体空间变换,基本的渲染API调用示例.
img 计算着色器
使用计算着色器对图片做描边等特效处理.
img 天空盒贴图
天空盒贴图与采样.
img 延迟阴影
延迟渲染以及多重平行光照阴影.
img 高光动态渲染
HDR贴图采样与伽马校正.
img 球谐天空盒
球谐光照简单实现.
img 法线贴图进阶
法线贴图渲染进阶,视差贴图,陡峭视差贴图,视差阻塞贴图实现.
img 顺序无关透明
使用贴图存储每帧颜色节点链表,排序后绘制透明物体.
img PBR基础
在材质提供金属度与粗糙度的基础上实现多光源漫反射与高光反射,通过菲涅尔,法线分布函数,几何遮挡函数影响反射比例.
img PBR间接光照
在案例PBR基础上添加间接光照,使用天空盒做预过滤环境贴图以及光源辐照度贴图来模拟间接光照.
img PBR贴图
在案例PBR间接光照上渲染带贴图模型.
img 光线步进基础
使用光线步进的方式渲染一个基础场景.
img 光线步进体积云
.
img 低差异随机采样
随机采样可视化与测试.
img BVH场景管理
实现BVH场景管理以及射线检测三角形.
img GPU实现光追
不依赖vulkan的光追api,在顶点和片段着色器上实现光线追踪.
img GPU光追BRDF
在案例GPU实现光追的基础上,增加计算着色器实现光追,实现PBR.
img HDR蒙特卡洛预处理
对HDR贴图进行蒙特卡洛积分的预处理,计算概率贴图,用于实现射线检测向更亮的地方集中.
img 光追盒子
使用vulkan的光追api实现经典光追盒子,实现透明,折射材质.
img 光追BRDF
使用vulkan的光追api实现BRDF.
img 光追重要性采样
在案例光追BRDF的基础上添加重要性采样.
img 混合渲染GBuffer
光追和传统管线混合渲染实现GBuffer.
img 混合渲染阴影
在案例混合渲染GBuffer的基础上实现阴影.
img 混合渲染环境遮罩
在案例混合渲染阴影的基础上实现环境遮蔽.
img 混合渲染动态漫反射全局光照
在案例混合渲染环境遮罩实现动态漫反射全局光照,光照探针原理.
img 混合渲染天空盒
混合渲染中的天空盒预处理.
img 混合渲染反射
在案例混合渲染间接光照的基础上实现反射材质.
img 混合渲染后期
在案例混合渲染反射的基础上对各个流程的结果进行后期处理.
img 混合渲染TAA降噪
在混合渲染后期的基础上实现TAA降噪,得到混合渲染最终结果.
img 向前分簇渲染
实现超多光源向前分簇渲染.
img 空间屏幕反射
空间屏幕反射的基础实现.
img 八叉树碰撞检测
使用八叉树实现正方体空间内的大量小球碰撞检测.
img 模型体素化
优化过的三角形和体素盒子交叉检测实现模型体素化与绘制instance进行可视化.
img 稀疏体素八叉树
在GPU中渲染场景生成稀疏体素八叉树并且通过射线检测进行可视化.
img 时域性抗锯齿
从时间维度上进行抗锯齿处理,使用同个像素在不同帧上的不同采样点,根据时间先后进行一个加权平均计算.
img 快速近似抗锯齿
运行于目标游戏渲染管线的后期处理阶段,常用于延迟渲染中模拟MSAA的效果.
img 反射阴影贴图
将场景中被光源照亮的区域当做像素光源进行采样实现光源二次反射的效果.

待开发案例

  • 稀疏体素八叉树全局光照
  • 联级阴影贴图CSM
  • 虚拟贴图
  • 遮挡剔除PVS
  • 光滑粒子流体模拟SPH

空文件

简介

基于Vulkan实现的基本渲染引擎框架以及高级算法案例 展开 收起
C++ 等 3 种语言
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/liangfuhou/maggot-engine.git
git@gitee.com:liangfuhou/maggot-engine.git
liangfuhou
maggot-engine
MaggotEngine
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891