diff --git a/inc/hgl/graph/RenderFramework.h b/inc/hgl/graph/RenderFramework.h index d08d3350..fbe3213f 100644 --- a/inc/hgl/graph/RenderFramework.h +++ b/inc/hgl/graph/RenderFramework.h @@ -38,13 +38,87 @@ enum class LightingCullingMode ENUM_CLASS_RANGE(None,Cluster) };//enum class LightingCullingMode +enum class BlendMode +{ + Opaque, + Mask, + Transparent, + Additive, + Subtractive +}; + +enum class RenderOrder +{ + First, ///<最先渲染 + + NearToFar, ///<从近到远 + Irrorder, ///<无序渲染 + FarToNear, ///<从远到近 + + Last, ///<最后渲染 + + ENUM_CLASS_RANGE(First,Last) +};//enum class RenderOrder + +class RenderModule; + +/** + * 渲染模块工作配置 + */ +class RenderModuleWorkConfig +{ + /** + * 渲染模块名称 + * 在render_module为nullptr时,用于创建或加载RenderModule。 + * 它和RenderModule返回的名称有可能一样,但也有可能不一样。 + */ + AnsiString render_module_name; + RenderModule *render_module=nullptr; + + BlendMode blend_mode; + RenderOrder render_order; + +public: + + const AnsiString &GetModuleName()const{return render_module_name;} ///<取得渲染模块名称 + + RenderModule *GetModule(){return render_module;} ///<取得渲染模块 + +public: + + RenderModuleWorkConfig(); + virtual ~RenderModuleWorkConfig()=default; +};//class RenderModuleWorkConfig + +/** +* 渲染模式配置 +*/ +class RenderingModeConfig +{ +};//class RenderingModeConfig + enum class RenderingMode { + /** + * 一次性直接渲染出来 + * 这个其实不支持,主要用于一些超简单没啥需求的渲染场景 + */ Forward, ///<前向渲染 - Deferred, ///<延迟渲染 + /** + * 增加了Early-Z pass以及光线剔除的直接渲染 + */ + ForwardPlus, ///<增强型前向渲染 - ENUM_CLASS_RANGE(Forward,Deferred) + /** + * 传统的延迟渲染 + * 第一个pass生成GBuffer(BaseColor/Normal等),第二个pass渲染渲染透明,第三个 + */ + GBufferDeferred, ///<延迟渲染 + + VisbilityDeferred, ///<可见性延迟渲染 + + ENUM_CLASS_RANGE(Forward,Visbility) };//enum class RenderingMode enum class RenderPhase diff --git a/inc/hgl/graph/RenderModule.h b/inc/hgl/graph/RenderModule.h deleted file mode 100644 index 3a3216d0..00000000 --- a/inc/hgl/graph/RenderModule.h +++ /dev/null @@ -1,66 +0,0 @@ -#pragma once - -#include -#include - -VK_NAMESPACE_BEGIN - -class RenderCmdBuffer; - -/** -* 渲染模块基类 -*/ -class RenderModule -{ - OSString module_name; - - VkExtent2D current_extent; - - bool module_enable; - bool module_ready; - -protected: - - virtual void SetModuleEnable(bool e){module_enable=e;} - virtual void SetModuleReady(bool r){module_ready=r;} - -public: - - const OSString &GetModuleName()const{return module_name;} - - const bool IsEnable ()const noexcept{return module_enable;} - const bool IsReady ()const noexcept{return module_ready;} - -public: - - NO_COPY_NO_MOVE(RenderModule) - - RenderModule(const OSString &name) - { - module_name=name; - } - - virtual ~RenderModule()=default; - - virtual bool Init(){return true;} - - virtual void Execute(const double,RenderCmdBuffer *){} - - virtual void OnResize(const VkExtent2D &ext){current_extent=ext;} - virtual void OnFocusLost(){} - - virtual void OnPreFrame(){} - virtual void OnPostFrame(){} -};//class RenderModule - -template RenderModule *Create() -{ - return new T(); -} - -typedef RenderModule *(*RenderModuleCreateFunc)(); - -bool RegistryRenderModule(const OSString &,RenderModuleCreateFunc); -RenderModule *GetRenderModule(const OSString &); - -VK_NAMESPACE_END diff --git a/inc/hgl/graph/module/GraphModule.h b/inc/hgl/graph/module/GraphModule.h new file mode 100644 index 00000000..6a282804 --- /dev/null +++ b/inc/hgl/graph/module/GraphModule.h @@ -0,0 +1,50 @@ +#pragma once + +#include + +VK_NAMESPACE_BEGIN + +class RenderCmdBuffer; + +class GraphModule +{ + AnsiString module_name; + + bool module_enable; + bool module_ready; + +protected: + + virtual void SetModuleEnable(bool e){module_enable=e;} + virtual void SetModuleReady(bool r){module_ready=r;} + +public: + + const AnsiString &GetModuleName()const{return module_name;} + + const bool IsEnable ()const noexcept{return module_enable;} + const bool IsReady ()const noexcept{return module_ready;} + +public: + + NO_COPY_NO_MOVE(GraphModule) + + GraphModule(const AnsiString &name){module_name=name;} + virtual ~GraphModule()=default; + + virtual bool Init(){return true;} + virtual void Execute(const double,RenderCmdBuffer *){} + +};//class GraphModule + +template GraphModule *Create() +{ + return new T(); +} + +typedef GraphModule *(*GraphModuleCreateFunc)(); + +bool RegistryGraphModule(const AnsiString &,GraphModuleCreateFunc); +GraphModule *GetGraphModule(const AnsiString &); + +VK_NAMESPACE_END \ No newline at end of file diff --git a/inc/hgl/graph/module/RenderModule.h b/inc/hgl/graph/module/RenderModule.h new file mode 100644 index 00000000..b23ddee1 --- /dev/null +++ b/inc/hgl/graph/module/RenderModule.h @@ -0,0 +1,32 @@ +#pragma once + +#include +#include + +VK_NAMESPACE_BEGIN + +/** +* 渲染模块基类 +*/ +class RenderModule:public GraphModule +{ + VkExtent2D current_extent; + +public: + + NO_COPY_NO_MOVE(RenderModule) + + RenderModule(const AnsiString &name):GraphModule(name){} + virtual ~RenderModule()=default; + + virtual bool Init()override{return true;} + + virtual void Execute(const double,RenderCmdBuffer *)override{} + + virtual void OnResize(const VkExtent2D &ext){current_extent=ext;} + virtual void OnFocusLost(){} + + virtual void OnPreFrame(){} + virtual void OnPostFrame(){} +};//class RenderModule + diff --git a/src/SceneGraph/CMakeLists.txt b/src/SceneGraph/CMakeLists.txt index 52b5a7fe..f135985d 100644 --- a/src/SceneGraph/CMakeLists.txt +++ b/src/SceneGraph/CMakeLists.txt @@ -274,22 +274,27 @@ SET(SG_COMPONENT_SOURCE ${SGC_SOURCE_PATH}/Component.cpp SOURCE_GROUP("Scene Graph\\Component" FILES ${SG_COMPONENT_HEADER} ${SG_COMPONENT_SOURCE}) -#-RenderModue,RenderFramework------------------------------------------- +#-GraphModule,RenderFramework------------------------------------------- -SET(RENDER_MODULE_HEADER ${SG_INCLUDE_PATH}/RenderModule.h) -SET(RENDER_MODULE_SOURCE RenderModule/RenderModule.cpp) +SET(SGM_HEADER_PATH ${SG_INCLUDE_PATH}/module) + +SET(GRAPH_MODULE_HEADER ${SGM_HEADER_PATH}/GraphModule.h + ${SGM_HEADER_PATH}/RenderModule.h) + +SET(GRAPH_MODULE_SOURCE module/GraphModule.cpp + module/RenderModule.cpp) SET(RENDER_FRAMEWORK_FILES ${SG_INCLUDE_PATH}/RenderFramework.h RenderFramework.cpp) -SOURCE_GROUP("RenderModule" FILES ${RENDER_MODULE_HEADER} - ${RENDER_MODULE_SOURCE} - ${RENDER_FRAMEWORK_FILES}) +SOURCE_GROUP("Render Framework" FILES ${GRAPH_MODULE_HEADER} + ${GRAPH_MODULE_SOURCE} + ${RENDER_FRAMEWORK_FILES}) SET(DEFERRED_RENDER_HEADER ${SG_INCLUDE_PATH}/deferred/GBufferFormat.h) SET(DEFERRED_RENDER_SOURCE deferred/GBufferFormat.cpp) -SOURCE_GROUP("RenderModule\\Deferred Rendering" FILES ${DEFERRED_RENDER_HEADER} ${DEFERRED_RENDER_SOURCE}) +SOURCE_GROUP("Graph Module\\Deferred Rendering" FILES ${DEFERRED_RENDER_HEADER} ${DEFERRED_RENDER_SOURCE}) IF(WIN32) OPTION(FORCE_DISCETE_GPU "Force Discrete GPU" OFF) @@ -361,6 +366,6 @@ add_cm_library(ULRE.SceneGraph "ULRE" ${SCENE_GRAPH_HEADER} ${SCENE_GRAPH_SOUR ${VULKAN_RENDER_SOURCE} ${VULKAN_SURFACE_SOURCE} - ${RENDER_MODULE_HEADER} ${RENDER_MODULE_SOURCE} ${RENDER_FRAMEWORK_FILES} + ${GRAPH_MODULE_HEADER} ${GRAPH_MODULE_SOURCE} ${RENDER_FRAMEWORK_FILES} ${DEFERRED_RENDER_HEADER} ${DEFERRED_RENDER_SOURCE} ) diff --git a/src/SceneGraph/RenderModule/RenderModule.cpp b/src/SceneGraph/module/GraphModule.cpp similarity index 59% rename from src/SceneGraph/RenderModule/RenderModule.cpp rename to src/SceneGraph/module/GraphModule.cpp index da87b0fc..2e948e95 100644 --- a/src/SceneGraph/RenderModule/RenderModule.cpp +++ b/src/SceneGraph/module/GraphModule.cpp @@ -1,16 +1,16 @@ -#include +#include #include VK_NAMESPACE_BEGIN namespace { - using RenderModuleMap=Map; + using GraphModuleMap=Map; - RenderModuleMap render_module_map; + GraphModuleMap render_module_map; }//namespace -bool RegistryRenderModule(const OSString &name,RenderModuleCreateFunc func) +bool RegistryGraphModule(const AnsiString &name,GraphModuleCreateFunc func) { if(name.IsEmpty()||!func) return(false); @@ -23,12 +23,12 @@ bool RegistryRenderModule(const OSString &name,RenderModuleCreateFunc func) return(true); } -RenderModule *GetRenderModule(const OSString &name) +GraphModule *GetGraphModule(const AnsiString &name) { if(name.IsEmpty()) return(nullptr); - RenderModuleCreateFunc func; + GraphModuleCreateFunc func; if(!render_module_map.Get(name,func)) return(nullptr); diff --git a/src/SceneGraph/module/RenderModule.cpp b/src/SceneGraph/module/RenderModule.cpp new file mode 100644 index 00000000..e69de29b