框架参考UE4实现内存管理,多线程,RenderGraph引擎底层功能,参考Filament基于Vulkan封装渲染API,GPU资产创建与管理,shader编译反射,imgui绘图,对Vulkan开发流程进行简化,方便快速实现各类算法demo.
必须在 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;
}
项目目录下必须创建 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();
});
以下案例基于本框架实现.
示例 | 说明 |
---|---|
初始场景 基础场景配置,渲染进程配置,普通纯色与贴图模型渲染,物体空间变换,基本的渲染API调用示例. |
|
计算着色器 使用计算着色器对图片做描边等特效处理. |
|
天空盒贴图 天空盒贴图与采样. |
|
延迟阴影 延迟渲染以及多重平行光照阴影. |
|
高光动态渲染 HDR贴图采样与伽马校正. |
|
球谐天空盒 球谐光照简单实现. |
|
法线贴图进阶 法线贴图渲染进阶,视差贴图,陡峭视差贴图,视差阻塞贴图实现. |
|
顺序无关透明 使用贴图存储每帧颜色节点链表,排序后绘制透明物体. |
|
PBR基础 在材质提供金属度与粗糙度的基础上实现多光源漫反射与高光反射,通过菲涅尔,法线分布函数,几何遮挡函数影响反射比例. |
|
PBR间接光照 在案例PBR基础上添加间接光照,使用天空盒做预过滤环境贴图以及光源辐照度贴图来模拟间接光照. |
|
PBR贴图 在案例PBR间接光照上渲染带贴图模型. |
|
光线步进基础 使用光线步进的方式渲染一个基础场景. |
|
光线步进体积云 . |
|
低差异随机采样 随机采样可视化与测试. |
|
BVH场景管理 实现BVH场景管理以及射线检测三角形. |
|
GPU实现光追 不依赖vulkan的光追api,在顶点和片段着色器上实现光线追踪. |
|
GPU光追BRDF 在案例GPU实现光追的基础上,增加计算着色器实现光追,实现PBR. |
|
HDR蒙特卡洛预处理 对HDR贴图进行蒙特卡洛积分的预处理,计算概率贴图,用于实现射线检测向更亮的地方集中. |
|
光追盒子 使用vulkan的光追api实现经典光追盒子,实现透明,折射材质. |
|
光追BRDF 使用vulkan的光追api实现BRDF. |
|
光追重要性采样 在案例光追BRDF的基础上添加重要性采样. |
|
混合渲染GBuffer 光追和传统管线混合渲染实现GBuffer. |
|
混合渲染阴影 在案例混合渲染GBuffer的基础上实现阴影. |
|
混合渲染环境遮罩 在案例混合渲染阴影的基础上实现环境遮蔽. |
|
混合渲染动态漫反射全局光照 在案例混合渲染环境遮罩实现动态漫反射全局光照,光照探针原理. |
|
混合渲染天空盒 混合渲染中的天空盒预处理. |
|
混合渲染反射 在案例混合渲染间接光照的基础上实现反射材质. |
|
混合渲染后期 在案例混合渲染反射的基础上对各个流程的结果进行后期处理. |
|
混合渲染TAA降噪 在混合渲染后期的基础上实现TAA降噪,得到混合渲染最终结果. |
|
向前分簇渲染 实现超多光源向前分簇渲染. |
|
空间屏幕反射 空间屏幕反射的基础实现. |
|
八叉树碰撞检测 使用八叉树实现正方体空间内的大量小球碰撞检测. |
|
模型体素化 优化过的三角形和体素盒子交叉检测实现模型体素化与绘制instance进行可视化. |
|
稀疏体素八叉树 在GPU中渲染场景生成稀疏体素八叉树并且通过射线检测进行可视化. |
|
时域性抗锯齿 从时间维度上进行抗锯齿处理,使用同个像素在不同帧上的不同采样点,根据时间先后进行一个加权平均计算. |
|
快速近似抗锯齿 运行于目标游戏渲染管线的后期处理阶段,常用于延迟渲染中模拟MSAA的效果. |
|
反射阴影贴图 将场景中被光源照亮的区域当做像素光源进行采样实现光源二次反射的效果. |
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。