diff --git a/inc/hgl/graph/CoordinateSystem.h b/inc/hgl/graph/CoordinateSystem.h new file mode 100644 index 00000000..2d4af169 --- /dev/null +++ b/inc/hgl/graph/CoordinateSystem.h @@ -0,0 +1,17 @@ +#pragma once + +#include +namespace hgl +{ + namespace graph + { + enum class CoordinateSystem2D + { + NDC, + ZeroToOne, //左上角为0,0;右下角为1,1 + Ortho, //左上角为0,0;右下角为(width-1),(height-1) + + ENUM_CLASS_RANGE(NDC,Ortho) + }; + }//namespace graph +}//namespace hgl diff --git a/inc/hgl/graph/RenderTargetOutputConfig.h b/inc/hgl/graph/RenderTargetOutputConfig.h new file mode 100644 index 00000000..81be9f63 --- /dev/null +++ b/inc/hgl/graph/RenderTargetOutputConfig.h @@ -0,0 +1,18 @@ +#ifndef HGL_GRAPH_RT_OUTPUT_CONFIG_INCLUDE +#define HGL_GRAPH_RT_OUTPUT_CONFIG_INCLUDE + +#include + +namespace hgl +{ + namespace graph + { + struct RenderTargetOutputConfig + { + uint color; ///<要输出几个颜色缓冲区 + bool depth; ///<是否输出到深度缓冲区 + bool stencil; ///<是否输出到模板缓冲区 + }; + }//namespace graph +}//namespace hgl +#endif//HGL_GRAPH_RT_OUTPUT_CONFIG_INCLUDE diff --git a/inc/hgl/graph/mtl/2d/Material2DConfig.h b/inc/hgl/graph/mtl/2d/Material2DConfig.h new file mode 100644 index 00000000..7fedd5f9 --- /dev/null +++ b/inc/hgl/graph/mtl/2d/Material2DConfig.h @@ -0,0 +1,27 @@ +#ifndef HGL_GRAPH_MTL_2D_CONFIG_INCLUDE +#define HGL_GRAPH_MTL_2D_CONFIG_INCLUDE + +#include +#include + +STD_MTL_NAMESPACE_BEGIN +struct Material2DConfig:public MaterialConfig +{ + CoordinateSystem2D coordinate_system; ///<使用的坐标系 + + bool local_to_world; ///<包含LocalToWorld矩阵 + +public: + + Material2DConfig(const AnsiString &name):MaterialConfig(name) + { + rt_output.color=1; + rt_output.depth=false; + rt_output.stencil=false; + + coordinate_system=CoordinateSystem2D::NDC; + local_to_world=false; + } +};//struct Material2DConfig:public MaterialConfig +STD_MTL_NAMESPACE_END +#endif//HGL_GRAPH_MTL_2D_CONFIG_INCLUDE diff --git a/inc/hgl/graph/mtl/2d/VertexColor2D.h b/inc/hgl/graph/mtl/2d/VertexColor2D.h index 23333846..d70ce309 100644 --- a/inc/hgl/graph/mtl/2d/VertexColor2D.h +++ b/inc/hgl/graph/mtl/2d/VertexColor2D.h @@ -1,26 +1,10 @@ #ifndef HGL_GRAPH_MTL_2D_VERTEX2D_INCLUDE #define HGL_GRAPH_MTL_2D_VERTEX2D_INCLUDE -#include - -namespace hgl -{ - namespace graph - { - class MaterialCreateInfo; - - namespace mtl - { - struct Material2DConfig - { - CoordinateSystem2D coordinate_system; ///<使用的坐标系 - - bool local_to_world=false; ///<包含LocalToWorld矩阵 - }; - - MaterialCreateInfo *CreateVertexColor2D(const Material2DConfig *); - }//namespace mtl - }//namespace graph -}//namespace hgl +#include"Std2DMaterial.h" +#include +STD_MTL_NAMESPACE_BEGIN +MaterialCreateInfo *CreateVertexColor2D(const Material2DConfig *); +STD_MTL_NAMESPACE_END #endif//HGL_GRAPH_MTL_2D_VERTEX2D_INCLUDE diff --git a/inc/hgl/graph/mtl/MaterialConfig.h b/inc/hgl/graph/mtl/MaterialConfig.h new file mode 100644 index 00000000..7235c3c6 --- /dev/null +++ b/inc/hgl/graph/mtl/MaterialConfig.h @@ -0,0 +1,31 @@ +#ifndef HGL_GRAPH_MTL_CONFIG_INCLUDE +#define HGL_GRAPH_MTL_CONFIG_INCLUDE + +#include +#include +#include +#include + +STD_MTL_NAMESPACE_BEGIN +/** + * 材质配置结构 + */ +struct MaterialConfig +{ + AnsiString mtl_name; ///<材质名称 + + RenderTargetOutputConfig rt_output; ///<渲染目标输出配置 + + uint32 shader_stage; ///<需要的shader + +public: + + MaterialConfig(const AnsiString &name) + { + mtl_name=name; + + shader_stage=VK_SHADER_STAGE_VERTEX_BIT|VK_SHADER_STAGE_FRAGMENT_BIT; + } +};//struct MaterialConfig +STD_MTL_NAMESPACE_END +#endif//HGL_GRAPH_MTL_CONFIG_INCLUDE diff --git a/inc/hgl/graph/mtl/StdMaterial.h b/inc/hgl/graph/mtl/StdMaterial.h index f228b055..4d1f8f98 100644 --- a/inc/hgl/graph/mtl/StdMaterial.h +++ b/inc/hgl/graph/mtl/StdMaterial.h @@ -4,104 +4,3 @@ #define STD_MTL_NAMESPACE_END }}} #define STD_MTL_NAMESPACE_USING using namespace hgl::graph::mtl; - -#include -#include - -STD_MTL_NAMESPACE_BEGIN - -enum class CoordinateSystem2D -{ - NDC, - ZeroToOne, //左上角为0,0;右下角为1,1 - Ortho, //左上角为0,0;右下角为(width-1),(height-1) - - ENUM_CLASS_RANGE(NDC,Ortho) -}; - -constexpr const ShaderBufferSource SBS_ViewportInfo= -{ - "ViewportInfo", - "viewport", - - R"( -mat4 ortho_matrix; - -vec2 canvas_resolution; -vec2 viewport_resolution; -vec2 inv_viewport_resolution; -)" -}; - -constexpr const ShaderBufferSource SBS_CameraInfo= -{ - "CameraInfo", - "camera", - - R"( -mat4 projection; -mat4 inverse_projection; - -mat4 view; -mat4 inverse_view; - -mat4 vp; -mat4 inverse_vp; - -mat4 sky; - -vec3 pos; //eye -vec3 view_line; //pos-target -vec3 world_up; - -float znear,zfar;)" -}; - -constexpr const ShaderBufferSource SBS_MaterialInstance= -{ - "MaterialInstanceData", - "mtl", - - "MaterialInstance mi[256];" -}; - -constexpr const ShaderBufferSource SBS_JointInfo= -{ - "JointInfo", - "joint", - -R"( - mat4 mats[]; -)" -}; - -namespace func -{ - constexpr const char GetLocalToWorld[]=R"( -mat4 GetLocalToWorld() -{ - return mat4(LocalToWorld_0, - LocalToWorld_1, - LocalToWorld_2, - LocalToWorld_3); -} -)"; - - constexpr const char GetJointMatrix[]=R"( -mat4 GetJointMatrix() -{ - return joint.mats[JointID.x]*JointWeight.x+ - joint.mats[JointID.y]*JointWeight.y+ - joint.mats[JointID.z]*JointWeight.z+ - joint.mats[JointID.w]*JointWeight.w; -} -)"; - - constexpr const char GetMI[]=R"( -MaterialInstance GetMI() -{ - return mtl.mi[MaterialInstanceID]; -} -)"; -}//namespace func -STD_MTL_NAMESPACE_END diff --git a/inc/hgl/shadergen/MaterialCreateInfo.h b/inc/hgl/shadergen/MaterialCreateInfo.h index f2599f5c..adee8d20 100644 --- a/inc/hgl/shadergen/MaterialCreateInfo.h +++ b/inc/hgl/shadergen/MaterialCreateInfo.h @@ -5,27 +5,17 @@ #include #include #include -#include +#include +#include +#include #include -namespace hgl{namespace graph{ - -struct RenderTargetOutputConfig -{ - uint color; - bool depth; - bool stencil; -}; - +STD_MTL_NAMESPACE_BEGIN class MaterialCreateInfo { - AnsiString shader_name; - protected: - RenderTargetOutputConfig rto_cfg; ///<输出配置 - - uint32_t shader_stage; ///<着色器阶段 + const MaterialConfig *config; MaterialDescriptorInfo mdi; ///<材质描述符管理器 @@ -40,11 +30,11 @@ protected: public: - const AnsiString &GetName()const{return shader_name;} + const AnsiString &GetName()const{return config->mtl_name;} - const uint32 GetShaderStage()const{return shader_stage;} + const uint32 GetShaderStage()const{return config->shader_stage;} - bool hasShader(const VkShaderStageFlagBits ss)const{return shader_stage&ss;} + bool hasShader(const VkShaderStageFlagBits ss)const{return config->shader_stage&ss;} bool hasVertex ()const{return hasShader(VK_SHADER_STAGE_VERTEX_BIT);} // bool hasTessCtrl()const{return hasShader(VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT);} @@ -59,7 +49,7 @@ public: public: - MaterialCreateInfo(const AnsiString &,const RenderTargetOutputConfig &,const uint32 ss=VK_SHADER_STAGE_VERTEX_BIT|VK_SHADER_STAGE_FRAGMENT_BIT); + MaterialCreateInfo(const MaterialConfig *); ~MaterialCreateInfo()=default; bool SetMaterialInstance(const AnsiString &codes,const uint32_t length) @@ -89,4 +79,4 @@ public: const MaterialDescriptorInfo &GetMDI()const{return mdi;} };//class MaterialCreateInfo -}}//namespace hgl::graph +STD_MTL_NAMESPACE_END diff --git a/src/ShaderGen/2d/Std2DMaterial.cpp b/src/ShaderGen/2d/Std2DMaterial.cpp new file mode 100644 index 00000000..a43219ee --- /dev/null +++ b/src/ShaderGen/2d/Std2DMaterial.cpp @@ -0,0 +1,27 @@ +#include"Std2DMaterial.h" +#include +#include + +STD_MTL_NAMESPACE_BEGIN +Std2DMaterial::Std2DMaterial(const Material2DConfig *c) +{ + MaterialCreateInfo *mci=new MaterialCreateInfo(c); +} + +Std2DMaterial::~Std2DMaterial() +{ + delete mci; +} + +bool Std2DMaterial::CreateVertexShader(ShaderCreateInfoVertex *vs) +{ +} + +bool Std2DMaterial::CreateFragmentShader(ShaderCreateInfoFragment *fs) +{ +} + +bool Std2DMaterial::Create() +{ +} +STD_MTL_NAMESPACE_END diff --git a/src/ShaderGen/2d/Std2DMaterial.h b/src/ShaderGen/2d/Std2DMaterial.h new file mode 100644 index 00000000..c08f0dd5 --- /dev/null +++ b/src/ShaderGen/2d/Std2DMaterial.h @@ -0,0 +1,39 @@ +#pragma once + +#include + +namespace hgl +{ + namespace graph + { + class ShaderCreateInfoVertex; + class ShaderCreateInfoFragment; + + namespace mtl + { + class MaterialCreateInfo; + struct Material2DConfig; + + class Std2DMaterial + { + protected: + + Material2DConfig *cfg; + + MaterialCreateInfo *mci; + + protected: + + virtual bool CreateVertexShader(ShaderCreateInfoVertex *)=0; + virtual bool CreateFragmentShader(ShaderCreateInfoFragment *)=0; + + public: + + Std2DMaterial(const Material2DConfig *); + virtual ~Std2DMaterial(); + + virtual bool Create()=0; + };//class Std2DMaterial + }//namespace mtl + }//namespace graph +}//namespace hgl diff --git a/src/ShaderGen/2d/VertexColor2D.cpp b/src/ShaderGen/2d/VertexColor2D.cpp index 85f453b7..75f71863 100644 --- a/src/ShaderGen/2d/VertexColor2D.cpp +++ b/src/ShaderGen/2d/VertexColor2D.cpp @@ -1,8 +1,10 @@ -#include -#include +#include +#include #include #include #include +#include"common/UBOCommon.h" +#include"common/MFCommon.h" STD_MTL_NAMESPACE_BEGIN MaterialCreateInfo *CreateVertexColor2D(const Material2DConfig *cfg) @@ -20,7 +22,7 @@ MaterialCreateInfo *CreateVertexColor2D(const Material2DConfig *cfg) false //不输出stencil }; - MaterialCreateInfo *mci=new MaterialCreateInfo(mtl_name,rtoc); + MaterialCreateInfo *mci=new MaterialCreateInfo(cfg); AnsiString sfComputePosition; diff --git a/src/ShaderGen/CMakeLists.txt b/src/ShaderGen/CMakeLists.txt index bef51b46..0720673a 100644 --- a/src/ShaderGen/CMakeLists.txt +++ b/src/ShaderGen/CMakeLists.txt @@ -35,18 +35,29 @@ SET(GLSL_COMPILER_SOURCE GLSLCompiler.h SOURCE_GROUP("GLSL Compiler" FILES ${GLSL_COMPILER_SOURCE}) +SET(SHADERGEN_COMMON_FILES common/UBOCommon.h + common/MFCommon.h) + +SOURCE_GROUP("Common" FILES ${SHADERGEN_COMMON_FILES}) + +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) + set(STD_MTL_HEADER_PATH ${ROOT_INCLUDE_PATH}/hgl/graph/mtl) SET(STD_MTL_2D_HEADER_PATH ${STD_MTL_HEADER_PATH}/2d) -SET(STD_MTL_2D_SOURCE_FILES ${STD_MTL_2D_HEADER_PATH}/VertexColor2D.h +SET(STD_MTL_2D_SOURCE_FILES ${STD_MTL_2D_HEADER_PATH}/Material2DConfig.h + ${STD_MTL_2D_HEADER_PATH}/VertexColor2D.h + 2d/Std2DMaterial.h + 2d/Std2DMaterial.cpp 2d/VertexColor2D.cpp) -SET(STANDARD_MATERIAL_SOURCE ${STD_MTL_HEADER_PATH}/StdMaterial.h - ${STD_MTL_HEADER_PATH}/ShaderBuffer.h - StandardMaterial.cpp) +SET(STD_MTL_SOURCE ${STD_MTL_HEADER_PATH}/MaterialConfig.h + ${STD_MTL_HEADER_PATH}/StdMaterial.h + ${STD_MTL_HEADER_PATH}/ShaderBuffer.h + StandardMaterial.cpp) -SOURCE_GROUP("Standard Material" FILES ${STANDARD_MATERIAL_SOURCE}) +SOURCE_GROUP("Standard Material" FILES ${STD_MTL_SOURCE}) SOURCE_GROUP("Standard Material\\2D" FILES ${STD_MTL_2D_SOURCE_FILES}) add_cm_library(ULRE.ShaderGen "ULRE" ${DESC_INFO_HEADER_FILES} @@ -55,7 +66,8 @@ add_cm_library(ULRE.ShaderGen "ULRE" ${DESC_INFO_HEADER_FILES} ${MATERIAL_CREATE_INFO_SOURCE_FILES} ${SHADER_CREATER_HEADER_FILES} ${SHADER_CREATER_SOURCE_FILES} - ${GLSL_COMPILER_SOURCE} - ${STANDARD_MATERIAL_SOURCE} + ${GLSL_COMPILER_SOURCE} + ${SHADERGEN_COMMON_FILES} + ${STD_MTL_SOURCE} ${STD_MTL_2D_SOURCE_FILES} ) diff --git a/src/ShaderGen/MaterialCreateInfo.cpp b/src/ShaderGen/MaterialCreateInfo.cpp index 8ad48961..9165695c 100644 --- a/src/ShaderGen/MaterialCreateInfo.cpp +++ b/src/ShaderGen/MaterialCreateInfo.cpp @@ -1,17 +1,14 @@ #include #include +#include"common/UBOCommon.h" using namespace hgl; using namespace hgl::graph; -namespace hgl{namespace graph{ -MaterialCreateInfo::MaterialCreateInfo(const AnsiString &n,const RenderTargetOutputConfig &cfg,const uint32 ss) +STD_MTL_NAMESPACE_BEGIN +MaterialCreateInfo::MaterialCreateInfo(const MaterialConfig *mc) { - shader_name=n; - - rto_cfg=cfg; - - shader_stage=ss; + config=mc; if(hasVertex ())shader_map.Add(vert=new ShaderCreateInfoVertex (&mdi));else vert=nullptr; if(hasGeometry ())shader_map.Add(geom=new ShaderCreateInfoGeometry(&mdi));else geom=nullptr; @@ -109,7 +106,7 @@ bool MaterialCreateInfo::AddUBO(const uint32_t flag_bits,const DescriptorSetType uint result=0; VkShaderStageFlagBits bit; - for(uint i=0;i0) { - AddUBO( shader_stage, + AddUBO( config->shader_stage, DescriptorSetType::Global, mtl::SBS_MaterialInstance); } @@ -149,4 +146,4 @@ bool MaterialCreateInfo::CreateShader() return(true); } -}}//namespace hgl::graph +STD_MTL_NAMESPACE_END diff --git a/src/ShaderGen/ShaderCreateInfoVertex.cpp b/src/ShaderGen/ShaderCreateInfoVertex.cpp index 90b47f04..9d655423 100644 --- a/src/ShaderGen/ShaderCreateInfoVertex.cpp +++ b/src/ShaderGen/ShaderCreateInfoVertex.cpp @@ -4,11 +4,7 @@ #include #include"GLSLCompiler.h" -namespace hgl{namespace graph{ - -using namespace hgl; -using namespace hgl::graph; - +VK_NAMESPACE_BEGIN int ShaderCreateInfoVertex::AddInput(const VAT &type,const AnsiString &name,const VkVertexInputRate input_rate,const VertexInputGroup &group) { ShaderAttribute *ss=new ShaderAttribute; @@ -63,4 +59,4 @@ bool ShaderCreateInfoVertex::ProcInput(ShaderCreateInfo *) return(true); } -}}//namespace hgl::graph +VK_NAMESPACE_END diff --git a/src/ShaderGen/common/MFCommon.h b/src/ShaderGen/common/MFCommon.h new file mode 100644 index 00000000..b10b7175 --- /dev/null +++ b/src/ShaderGen/common/MFCommon.h @@ -0,0 +1,35 @@ +#pragma once + +#include + +STD_MTL_NAMESPACE_BEGIN +namespace func +{ + constexpr const char GetLocalToWorld[]=R"( +mat4 GetLocalToWorld() +{ + return mat4(LocalToWorld_0, + LocalToWorld_1, + LocalToWorld_2, + LocalToWorld_3); +} +)"; + + constexpr const char GetJointMatrix[]=R"( +mat4 GetJointMatrix() +{ + return joint.mats[JointID.x]*JointWeight.x+ + joint.mats[JointID.y]*JointWeight.y+ + joint.mats[JointID.z]*JointWeight.z+ + joint.mats[JointID.w]*JointWeight.w; +} +)"; + + constexpr const char GetMI[]=R"( +MaterialInstance GetMI() +{ + return mtl.mi[MaterialInstanceID]; +} +)"; +}//namespace func +STD_MTL_NAMESPACE_END diff --git a/src/ShaderGen/common/UBOCommon.h b/src/ShaderGen/common/UBOCommon.h new file mode 100644 index 00000000..46af4100 --- /dev/null +++ b/src/ShaderGen/common/UBOCommon.h @@ -0,0 +1,62 @@ +#pragma once + +#include +#include + +STD_MTL_NAMESPACE_BEGIN +constexpr const ShaderBufferSource SBS_ViewportInfo= +{ + "ViewportInfo", + "viewport", + + R"( +mat4 ortho_matrix; + +vec2 canvas_resolution; +vec2 viewport_resolution; +vec2 inv_viewport_resolution; +)" +}; + +constexpr const ShaderBufferSource SBS_CameraInfo= +{ + "CameraInfo", + "camera", + + R"( +mat4 projection; +mat4 inverse_projection; + +mat4 view; +mat4 inverse_view; + +mat4 vp; +mat4 inverse_vp; + +mat4 sky; + +vec3 pos; //eye +vec3 view_line; //pos-target +vec3 world_up; + +float znear,zfar;)" +}; + +constexpr const ShaderBufferSource SBS_MaterialInstance= +{ + "MaterialInstanceData", + "mtl", + + "MaterialInstance mi[256];" +}; + +constexpr const ShaderBufferSource SBS_JointInfo= +{ + "JointInfo", + "joint", + +R"( + mat4 mats[]; +)" +}; +STD_MTL_NAMESPACE_END