From 6b8e76b75fbd473db73c838cee269a92dd9a0ffc Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Mon, 6 Mar 2023 14:06:20 +0800 Subject: [PATCH] split codes of ShaderGen --- CMakeLists.txt | 2 +- example/CMakeLists.txt | 13 + example/MaterialCreaterTest.cpp | 91 ++++ inc/hgl/shadergen/MaterialCreater.h | 50 +++ inc/hgl/shadergen/MaterialDescriptorManager.h | 2 +- inc/hgl/shadergen/ShaderCreater.h | 39 ++ inc/hgl/shadergen/ShaderCreaterFragment.h | 15 + inc/hgl/shadergen/ShaderCreaterGeometry.h | 13 + inc/hgl/shadergen/ShaderCreaterMap.h | 25 ++ inc/hgl/shadergen/ShaderCreaterVertex.h | 15 + inc/hgl/shadergen/ShaderDescriptorManager.h | 2 +- .../{ShaderCommon.h => ShaderGenNamespace.h} | 0 src/ShaderGen/CMakeLists.txt | 32 +- src/ShaderGen/MaterialCreater.cpp | 388 ++++-------------- src/ShaderGen/ShaderCreater.cpp | 52 +++ src/ShaderGen/ShaderCreaterFragment.cpp | 23 ++ src/ShaderGen/ShaderCreaterGeometry.cpp | 0 src/ShaderGen/ShaderCreaterVertex.cpp | 13 + 18 files changed, 462 insertions(+), 313 deletions(-) create mode 100644 example/MaterialCreaterTest.cpp create mode 100644 inc/hgl/shadergen/MaterialCreater.h create mode 100644 inc/hgl/shadergen/ShaderCreater.h create mode 100644 inc/hgl/shadergen/ShaderCreaterFragment.h create mode 100644 inc/hgl/shadergen/ShaderCreaterGeometry.h create mode 100644 inc/hgl/shadergen/ShaderCreaterMap.h create mode 100644 inc/hgl/shadergen/ShaderCreaterVertex.h rename inc/hgl/shadergen/{ShaderCommon.h => ShaderGenNamespace.h} (100%) create mode 100644 src/ShaderGen/ShaderCreater.cpp create mode 100644 src/ShaderGen/ShaderCreaterFragment.cpp create mode 100644 src/ShaderGen/ShaderCreaterGeometry.cpp create mode 100644 src/ShaderGen/ShaderCreaterVertex.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 4a0b3de8..d255f512 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,7 +24,7 @@ SET(ULRE CMCore CMSceneGraph CMUtil ULRE.Util -# ULRE.ShaderGen + ULRE.ShaderGen ULRE.SceneGraph ${HGL_GLM_LIB} ${RENDER_LIBRARY} diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index d1ce92ac..aa6ec432 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -5,3 +5,16 @@ SET(VULKAN_APP_FRAMEWORK ${CMAKE_CURRENT_SOURCE_DIR}/common/VulkanAppFramework.h add_subdirectory(Vulkan) add_subdirectory(2dVector) add_subdirectory(GUI) + +macro(CreateProject name) + add_executable(${name} ${ARGN}) + target_link_libraries(${name} ${ULRE}) + + IF(WIN32) + set_target_properties(${name} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY ${ULRE_RUNTIME_PATH}) + ENDIF() + + set_property(TARGET ${name} PROPERTY FOLDER "ULRE/Example") +endmacro() + +CreateProject(MaterialCreaterTest MaterialCreaterTest.cpp) diff --git a/example/MaterialCreaterTest.cpp b/example/MaterialCreaterTest.cpp new file mode 100644 index 00000000..9ab29b79 --- /dev/null +++ b/example/MaterialCreaterTest.cpp @@ -0,0 +1,91 @@ +#include + +using namespace hgl; +using namespace hgl::graph; +using namespace hgl::shadergen; + +bool PureColorMaterial() +{ + MaterialCreater mc(1); //一个新材质,1个RT输出,默认使用Vertex/Fragment shader + + //vertex部分 + { + ShaderCreaterVertex *vsc=mc.GetVS(); //获取vertex shader creater + + //以下代码会被展开为 + /* + layout(location=?) in vec3 Position; //位置属性 + */ + vsc->AddInput("vec3","Position"); //添加一个vec3类型的position属性输入 + + //以下代码会被展开为 + /* + vec3 GetPosition(void) + { + return Position; + } + */ + vsc->AddFunction("vec3","GetPosition","void","return Position;"); + + //使用缺省main函数,会产生如下代码 + /* + void main() + { + gl_Position=GetPosition(); + } + */ + vsc->UseDefaultMain(); + } + + //添加一个名称为ColorMaterial的UBO定义,其内部有一个vec4 color的属性 + //该代码会被展开为 + /* + struct ColorMaterial + { + vec4 color; + }; + */ + mc.AddUBOStruct("ColorMaterial","vec4 color;"); + + //添加一个UBO,该代码会被展开为 + /* + layout(set=?,binding=?) uniform ColorMaterial mtl; + */ + mc.AddUBO( VK_SHADER_STAGE_FRAGMENT_BIT, //这个UBO出现在fragment shader + DescriptorSetType::PerMaterial, //它属于材质合集 + "ColorMaterial", //UBO名称为ColorMaterial + "mtl"); //UBO变量名称为mtl + + //fragment部分 + { + ShaderCreaterFragment *fsc=mc.GetFS(); //获取fragment shader creater + + //以下代码会被合并成 vec4 GetColor(/**/){return mtl.color;} + fsc->AddFunction("vec4","GetColor","/**/","return mtl.color;"); + + //以下代码会被展开为 + /* + layout(location=?) out vec4 Color; //颜色输出 + */ + fsc->AddOutput("vec4","Color"); //添加一个vec4类型的color属性输出 + //同时,如果拥有多个输出,会直接根据输出的数量,DefaultMain会根据对应的Output名称,要求GetXXX()函数 + + //使用缺省main函数,会产生如下代码 + /* + void main() + { + Color=GetColor(); + } + */ + fsc->UseDefaultMain(); + } + + return(false); +} + +int MaterialCreaterTest() +{ + + + return 0; +} diff --git a/inc/hgl/shadergen/MaterialCreater.h b/inc/hgl/shadergen/MaterialCreater.h new file mode 100644 index 00000000..221153dc --- /dev/null +++ b/inc/hgl/shadergen/MaterialCreater.h @@ -0,0 +1,50 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +SHADERGEN_NAMESPACE_BEGIN +class MaterialCreater +{ + uint rt_count; ///<输出的RT数量 + + uint32_t shader_stage; ///<着色器阶段 + + MaterialDescriptorManager MDM; ///<材质描述符管理器 + + ShaderCreaterMap shader_map; ///<着色器列表 + + ShaderCreaterVertex *vert; + ShaderCreaterGeometry *geom; + ShaderCreaterFragment *frag; + +public: + + bool hasShader(const VkShaderStageFlagBits ss)const{return shader_stage&ss;} + + bool hasVertex ()const{return hasShader(VK_SHADER_STAGE_VERTEX_BIT);} +// bool hasTessCtrl()const{return hasShader(VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT);} +// bool hasTessEval()const{return hasShader(VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT);} + bool hasGeometry()const{return hasShader(VK_SHADER_STAGE_GEOMETRY_BIT);} + bool hasFragment()const{return hasShader(VK_SHADER_STAGE_FRAGMENT_BIT);} +// bool hasCompute ()const{return hasShader(VK_SHADER_STAGE_COMPUTE_BIT);} + + ShaderCreaterVertex * GetVS(){return vert;} + ShaderCreaterGeometry * GetGS(){return geom;} + ShaderCreaterFragment * GetFS(){return frag;} + +public: + + MaterialCreater(const uint rc,const uint32 ss=VK_SHADER_STAGE_VERTEX_BIT|VK_SHADER_STAGE_FRAGMENT_BIT); + ~MaterialCreater()=default; + + bool AddUBOStruct(const AnsiString &ubo_typename,const AnsiString &codes); + + bool AddUBO(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const AnsiString &type_name,const AnsiString &name); + bool AddSampler(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const SamplerType &st,const AnsiString &name); +};//class MaterialCreater +SHADERGEN_NAMESPACE_END \ No newline at end of file diff --git a/inc/hgl/shadergen/MaterialDescriptorManager.h b/inc/hgl/shadergen/MaterialDescriptorManager.h index d02207cf..5d2e91ef 100644 --- a/inc/hgl/shadergen/MaterialDescriptorManager.h +++ b/inc/hgl/shadergen/MaterialDescriptorManager.h @@ -2,7 +2,7 @@ #include #include -#include +#include #include using namespace hgl; diff --git a/inc/hgl/shadergen/ShaderCreater.h b/inc/hgl/shadergen/ShaderCreater.h new file mode 100644 index 00000000..866da4cd --- /dev/null +++ b/inc/hgl/shadergen/ShaderCreater.h @@ -0,0 +1,39 @@ +#ifndef HGL_SHADER_CREATER_INCLUDE +#define HGL_SHADER_CREATER_INCLUDE + +#include + +SHADERGEN_NAMESPACE_BEGIN +class ShaderCreater +{ + VkShaderStageFlagBits shader_stage; ///<着色器阶段 + +protected: + + AnsiString main_codes; + +public: + + ShaderDescriptorManager sdm; + + VkShaderStageFlagBits GetShaderStage()const{return shader_stage;} + +public: + + ShaderCreater(VkShaderStageFlagBits ss):sdm(ss) + { + shader_stage=ss; + } + + virtual ~ShaderCreater()=default; + + int AddInput(const VAT &type,const AnsiString &name); + int AddInput(const AnsiString &type,const AnsiString &name); + + int AddOutput(const VAT &type,const AnsiString &name); + int AddOutput(const AnsiString &type,const AnsiString &name); + + bool AddFunction(const AnsiString &return_type,const AnsiString &func_name,const AnsiString ¶m_list,const AnsiString &codes); +};//class ShaderCreater +SHADERGEN_NAMESPACE_END +#endif//HGL_SHADER_CREATER_INCLUDE \ No newline at end of file diff --git a/inc/hgl/shadergen/ShaderCreaterFragment.h b/inc/hgl/shadergen/ShaderCreaterFragment.h new file mode 100644 index 00000000..78f45f10 --- /dev/null +++ b/inc/hgl/shadergen/ShaderCreaterFragment.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +SHADERGEN_NAMESPACE_BEGIN +class ShaderCreaterFragment:public ShaderCreater +{ +public: + + ShaderCreaterFragment():ShaderCreater(VK_SHADER_STAGE_FRAGMENT_BIT){} + ~ShaderCreaterFragment()=default; + + void UseDefaultMain(); +}; +SHADERGEN_NAMESPACE_END \ No newline at end of file diff --git a/inc/hgl/shadergen/ShaderCreaterGeometry.h b/inc/hgl/shadergen/ShaderCreaterGeometry.h new file mode 100644 index 00000000..cfa749af --- /dev/null +++ b/inc/hgl/shadergen/ShaderCreaterGeometry.h @@ -0,0 +1,13 @@ +#pragma once + +#include + +SHADERGEN_NAMESPACE_BEGIN +class ShaderCreaterGeometry:public ShaderCreater +{ +public: + + ShaderCreaterGeometry():ShaderCreater(VK_SHADER_STAGE_GEOMETRY_BIT){} + ~ShaderCreaterGeometry()=default; +}; +SHADERGEN_NAMESPACE_END \ No newline at end of file diff --git a/inc/hgl/shadergen/ShaderCreaterMap.h b/inc/hgl/shadergen/ShaderCreaterMap.h new file mode 100644 index 00000000..08042467 --- /dev/null +++ b/inc/hgl/shadergen/ShaderCreaterMap.h @@ -0,0 +1,25 @@ +#pragma once + +#include + +SHADERGEN_NAMESPACE_BEGIN +class ShaderCreaterMap:public ObjectMap +{ +public: + + using ObjectMap::ObjectMap; + + bool Add(ShaderCreater *sc) + { + if(!sc)return(false); + + VkShaderStageFlagBits flag=sc->GetShaderStage(); + + if(KeyExist(flag)) + return(false); + + ObjectMap::Add(flag,sc); + return(true); + } +}; +SHADERGEN_NAMESPACE_END diff --git a/inc/hgl/shadergen/ShaderCreaterVertex.h b/inc/hgl/shadergen/ShaderCreaterVertex.h new file mode 100644 index 00000000..9f0913df --- /dev/null +++ b/inc/hgl/shadergen/ShaderCreaterVertex.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +SHADERGEN_NAMESPACE_BEGIN +class ShaderCreaterVertex:public ShaderCreater +{ +public: + + ShaderCreaterVertex():ShaderCreater(VK_SHADER_STAGE_VERTEX_BIT){} + ~ShaderCreaterVertex()=default; + + void UseDefaultMain(); +}; +SHADERGEN_NAMESPACE_END \ No newline at end of file diff --git a/inc/hgl/shadergen/ShaderDescriptorManager.h b/inc/hgl/shadergen/ShaderDescriptorManager.h index b37f8a8b..90328107 100644 --- a/inc/hgl/shadergen/ShaderDescriptorManager.h +++ b/inc/hgl/shadergen/ShaderDescriptorManager.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include #include diff --git a/inc/hgl/shadergen/ShaderCommon.h b/inc/hgl/shadergen/ShaderGenNamespace.h similarity index 100% rename from inc/hgl/shadergen/ShaderCommon.h rename to inc/hgl/shadergen/ShaderGenNamespace.h diff --git a/src/ShaderGen/CMakeLists.txt b/src/ShaderGen/CMakeLists.txt index b28ce074..96ab5540 100644 --- a/src/ShaderGen/CMakeLists.txt +++ b/src/ShaderGen/CMakeLists.txt @@ -1,9 +1,29 @@ set(SHADERGEN_INCLUDE_PATH ${ROOT_INCLUDE_PATH}/hgl/shadergen) -SET(SHADERGEN_HEADER_FILES ${SHADERGEN_INCLUDE_PATH}/ShaderCommon.h + +SET(SHADER_CREATER_HEADER_FILES ${SHADERGEN_INCLUDE_PATH}/ShaderCreater.h + ${SHADERGEN_INCLUDE_PATH}/ShaderCreaterMap.h + ${SHADERGEN_INCLUDE_PATH}/ShaderCreaterVertex.h + ${SHADERGEN_INCLUDE_PATH}/ShaderCreaterGeometry.h + ${SHADERGEN_INCLUDE_PATH}/ShaderCreaterFragment.h) + +SET(SHADER_CREATER_SOURCE_FILES ShaderCreater.cpp + ShaderCreaterVertex.cpp + ShaderCreaterGeometry.cpp + ShaderCreaterFragment.cpp) + +SOURCE_GROUP("Material Creater\\Shader Creater" FILES ${SHADER_CREATER_HEADER_FILES} + ${SHADER_CREATER_SOURCE_FILES}) + +SET(MATERIAL_CREATER_HEADER_FILES ${SHADERGEN_INCLUDE_PATH}/MaterialCreater.h) +SET(MATERIAL_CREATER_SOURCE_FILES MaterialCreater.cpp) + +SOURCE_GROUP("Material Creater" FILES ${MATERIAL_CREATER_HEADER_FILES} + ${MATERIAL_CREATER_SOURCE_FILES}) + +SET(SHADERGEN_HEADER_FILES ${SHADERGEN_INCLUDE_PATH}/ShaderGenNamespace.h ${SHADERGEN_INCLUDE_PATH}/ShaderDescriptorManager.h - ${SHADERGEN_INCLUDE_PATH}/MaterialDescriptorManager.h -) + ${SHADERGEN_INCLUDE_PATH}/MaterialDescriptorManager.h) SET(SHADERGEN_SOURCE_FILES #PMC.cpp @@ -17,4 +37,8 @@ SET(SHADERGEN_SOURCE_FILES add_cm_library(ULRE.ShaderGen "ULRE" ${SHADERGEN_HEADER_FILES} ${SHADERGEN_SOURCE_FILES} - MaterialCreater.cpp) + ${MATERIAL_CREATER_HEADER_FILES} + ${MATERIAL_CREATER_SOURCE_FILES} + ${SHADER_CREATER_HEADER_FILES} + ${SHADER_CREATER_SOURCE_FILES} +) diff --git a/src/ShaderGen/MaterialCreater.cpp b/src/ShaderGen/MaterialCreater.cpp index 70e4b81c..e424da44 100644 --- a/src/ShaderGen/MaterialCreater.cpp +++ b/src/ShaderGen/MaterialCreater.cpp @@ -1,319 +1,95 @@ -#include -#include -#include -#include -#include -#include -#include -#include +#include using namespace hgl; using namespace hgl::graph; SHADERGEN_NAMESPACE_BEGIN -class ShaderCreater +MaterialCreater::MaterialCreater(const uint rc,const uint32 ss) { - VkShaderStageFlagBits shader_stage; ///<着色器阶段 + rt_count=rc; + shader_stage=ss; -public: - - ShaderDescriptorManager sdm; - - VkShaderStageFlagBits GetShaderStage()const{return shader_stage;} - -public: - - ShaderCreater(VkShaderStageFlagBits ss):sdm(ss) - { - shader_stage=ss; - } - - ~ShaderCreater() - { - } - - int AddInput(const VAT &type,const AnsiString &name) - { - ShaderStage *ss=new ShaderStage; - - hgl::strcpy(ss->name,sizeof(ss->name),name.c_str()); - - ss->basetype=(uint8) type.basetype; - ss->vec_size= type.vec_size; - - return sdm.AddInput(ss); - } - - int AddInput(const AnsiString &type,const AnsiString &name) - { - VAT vat; - - if(!ParseVertexAttribType(&vat,type)) - return(-2); - - return AddInput(vat,name); - } - - int AddOutput(const VAT &type,const AnsiString &name) - { - ShaderStage *ss=new ShaderStage; - - hgl::strcpy(ss->name,sizeof(ss->name),name.c_str()); - - ss->basetype=(uint8) type.basetype; - ss->vec_size= type.vec_size; - - return sdm.AddOutput(ss); - } - - int AddOutput(const AnsiString &type,const AnsiString &name) - { - VAT vat; - - if(!ParseVertexAttribType(&vat,type)) - return(-2); - - return AddOutput(vat,name); - } - - bool AddFunction(const AnsiString &return_type,const AnsiString &func_name,const AnsiString ¶m_list,const AnsiString &codes) - { - //return sdm.AddFunction(return_type,func_name,param_list,code); - } -}; - -class ShaderCreaterMap:public ObjectMap -{ -public: - - using ObjectMap::ObjectMap; - - bool Add(ShaderCreater *sc) - { - if(!sc)return(false); - - VkShaderStageFlagBits flag=sc->GetShaderStage(); - - if(KeyExist(flag)) - return(false); - - ObjectMap::Add(flag,sc); - return(true); - } -}; - -class VertexShaderCreater:public ShaderCreater -{ -public: - - VertexShaderCreater():ShaderCreater(VK_SHADER_STAGE_VERTEX_BIT){} - ~VertexShaderCreater()=default; -}; - -class GeometryShaderCreater:public ShaderCreater -{ -public: - - GeometryShaderCreater():ShaderCreater(VK_SHADER_STAGE_GEOMETRY_BIT){} - ~GeometryShaderCreater()=default; -}; - -class FragmentShaderCreater:public ShaderCreater -{ -public: - - FragmentShaderCreater():ShaderCreater(VK_SHADER_STAGE_FRAGMENT_BIT){} - ~FragmentShaderCreater()=default; -}; - -class MaterialCreater -{ - uint rt_count; ///<输出的RT数量 - - uint32_t shader_stage; ///<着色器阶段 - - MaterialDescriptorManager MDM; ///<材质描述符管理器 - - ShaderCreaterMap shader_map; ///<着色器列表 - - VertexShaderCreater *vert; - GeometryShaderCreater *geom; - FragmentShaderCreater *frag; - -public: - - bool hasShader(const VkShaderStageFlagBits ss)const{return shader_stage&ss;} - - bool hasVertex ()const{return hasShader(VK_SHADER_STAGE_VERTEX_BIT);} -// bool hasTessCtrl()const{return hasShader(VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT);} -// bool hasTessEval()const{return hasShader(VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT);} - bool hasGeometry()const{return hasShader(VK_SHADER_STAGE_GEOMETRY_BIT);} - bool hasFragment()const{return hasShader(VK_SHADER_STAGE_FRAGMENT_BIT);} -// bool hasCompute ()const{return hasShader(VK_SHADER_STAGE_COMPUTE_BIT);} - - VertexShaderCreater * GetVS(){return vert;} - GeometryShaderCreater * GetGS(){return geom;} - FragmentShaderCreater * GetFS(){return frag;} - -public: - - MaterialCreater(const uint rc,const uint32 ss=VK_SHADER_STAGE_VERTEX_BIT|VK_SHADER_STAGE_FRAGMENT_BIT) - { - rt_count=rc; - shader_stage=ss; - - if(hasVertex ())shader_map.Add(vert=new VertexShaderCreater );else vert=nullptr; - if(hasGeometry ())shader_map.Add(geom=new GeometryShaderCreater);else geom=nullptr; - if(hasFragment ())shader_map.Add(frag=new FragmentShaderCreater);else frag=nullptr; - } - - ~MaterialCreater() - { - } - - bool AddUBOStruct(const AnsiString &ubo_typename,const AnsiString &codes) - { - if(ubo_typename.IsEmpty()||codes.IsEmpty()) - return(false); - - return MDM.AddUBOStruct(ubo_typename,codes); - } - - bool AddUBO(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const AnsiString &type_name,const AnsiString &name) - { - if(!shader_map.KeyExist(flag_bits)) - return(false); - - if(!MDM.hasUBOStruct(type_name)) - return(false); - - ShaderCreater *sc=shader_map[flag_bits]; - - if(!sc) - return(false); - - UBODescriptor *ubo=MDM.GetUBO(name); - - if(ubo) - { - if(ubo->type!=type_name) - return(false); - - ubo->stage_flag|=flag_bits; - - return sc->sdm.AddUBO(set_type,ubo); - } - else - { - ubo=new UBODescriptor(); - - ubo->type=type_name; - ubo->name=name; - - return sc->sdm.AddUBO(set_type,MDM.AddUBO(flag_bits,set_type,ubo)); - } - } - - bool AddSampler(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const SamplerType &st,const AnsiString &name) - { - if(!shader_map.KeyExist(flag_bits)) - return(false); - - RANGE_CHECK_RETURN_FALSE(st); - - ShaderCreater *sc=shader_map[flag_bits]; - - if(!sc) - return(false); - - SamplerDescriptor *sampler=MDM.GetSampler(name); - - AnsiString st_name=GetSamplerTypeName(st); - - if(sampler) - { - if(sampler->type!=st_name) - return(false); - - sampler->stage_flag|=flag_bits; - - return sc->sdm.AddSampler(set_type,sampler); - } - else - { - sampler=new SamplerDescriptor(); - - sampler->type=st_name; - sampler->name=name; - - return sc->sdm.AddSampler(set_type,MDM.AddSampler(flag_bits,set_type,sampler)); - } - } -};//class MaterialCreater - -#ifdef _DEBUG -bool PureColorMaterial() -{ - MaterialCreater mc(1); //一个新材质,1个RT输出,默认使用Vertex/Fragment shader - - //vertex部分 - { - VertexShaderCreater *vsc=mc.GetVS(); //获取vertex shader creater - - //以下代码会被展开为 - /* - layout(location=?) in vec3 Position; //位置属性 - */ - vsc->AddInput("vec3","Position"); //添加一个vec3类型的position属性输入 - - //以下代码会被展开为 - /* - vec3 GetPosition(void) - { - return Position; - } - */ - vsc->AddFunction("vec3","GetPosition","void","return Position;"); - } - - //添加一个名称为ColorMaterial的UBO定义,其内部有一个vec4 color的属性 - //该代码会被展开为 - /* - struct ColorMaterial - { - vec4 color; - }; - */ - mc.AddUBOStruct("ColorMaterial","vec4 color;"); - - //添加一个UBO,该代码会被展开为 - /* - layout(set=?,binding=?) uniform ColorMaterial mtl; - */ - mc.AddUBO( VK_SHADER_STAGE_FRAGMENT_BIT, //这个UBO出现在fragment shader - DescriptorSetType::PerMaterial, //它属于材质合集 - "ColorMaterial", //UBO名称为ColorMaterial - "mtl"); //UBO变量名称为mtl - - //fragment部分 - { - FragmentShaderCreater *fsc=mc.GetFS(); //获取fragment shader creater - - //以下代码会被合并成 vec4 GetColor(/**/){return mtl.color;} - fsc->AddFunction("vec4","GetColor","/**/","return mtl.color;"); - - fsc->AddOutput("vec4","Color"); //添加一个vec4类型的color属性输出 - - } - - return(false); + if(hasVertex ())shader_map.Add(vert=new ShaderCreaterVertex );else vert=nullptr; + if(hasGeometry ())shader_map.Add(geom=new ShaderCreaterGeometry);else geom=nullptr; + if(hasFragment ())shader_map.Add(frag=new ShaderCreaterFragment);else frag=nullptr; } -int MaterialCreaterTest() +bool MaterialCreater::AddUBOStruct(const AnsiString &ubo_typename,const AnsiString &codes) { - + if(ubo_typename.IsEmpty()||codes.IsEmpty()) + return(false); - return 0; + return MDM.AddUBOStruct(ubo_typename,codes); +} + +bool MaterialCreater::AddUBO(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const AnsiString &type_name,const AnsiString &name) +{ + if(!shader_map.KeyExist(flag_bits)) + return(false); + + if(!MDM.hasUBOStruct(type_name)) + return(false); + + ShaderCreater *sc=shader_map[flag_bits]; + + if(!sc) + return(false); + + UBODescriptor *ubo=MDM.GetUBO(name); + + if(ubo) + { + if(ubo->type!=type_name) + return(false); + + ubo->stage_flag|=flag_bits; + + return sc->sdm.AddUBO(set_type,ubo); + } + else + { + ubo=new UBODescriptor(); + + ubo->type=type_name; + ubo->name=name; + + return sc->sdm.AddUBO(set_type,MDM.AddUBO(flag_bits,set_type,ubo)); + } +} + +bool MaterialCreater::AddSampler(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const SamplerType &st,const AnsiString &name) +{ + if(!shader_map.KeyExist(flag_bits)) + return(false); + + RANGE_CHECK_RETURN_FALSE(st); + + ShaderCreater *sc=shader_map[flag_bits]; + + if(!sc) + return(false); + + SamplerDescriptor *sampler=MDM.GetSampler(name); + + AnsiString st_name=GetSamplerTypeName(st); + + if(sampler) + { + if(sampler->type!=st_name) + return(false); + + sampler->stage_flag|=flag_bits; + + return sc->sdm.AddSampler(set_type,sampler); + } + else + { + sampler=new SamplerDescriptor(); + + sampler->type=st_name; + sampler->name=name; + + return sc->sdm.AddSampler(set_type,MDM.AddSampler(flag_bits,set_type,sampler)); + } } -#endif//_DEBUG SHADERGEN_NAMESPACE_END diff --git a/src/ShaderGen/ShaderCreater.cpp b/src/ShaderGen/ShaderCreater.cpp new file mode 100644 index 00000000..2b8d6004 --- /dev/null +++ b/src/ShaderGen/ShaderCreater.cpp @@ -0,0 +1,52 @@ +#include + +SHADERGEN_NAMESPACE_BEGIN +int ShaderCreater::AddInput(const VAT &type,const AnsiString &name) +{ + ShaderStage *ss=new ShaderStage; + + hgl::strcpy(ss->name,sizeof(ss->name),name.c_str()); + + ss->basetype=(uint8) type.basetype; + ss->vec_size= type.vec_size; + + return sdm.AddInput(ss); +} + +int ShaderCreater::AddInput(const AnsiString &type,const AnsiString &name) +{ + VAT vat; + + if(!ParseVertexAttribType(&vat,type)) + return(-2); + + return AddInput(vat,name); +} + +int ShaderCreater::AddOutput(const VAT &type,const AnsiString &name) +{ + ShaderStage *ss=new ShaderStage; + + hgl::strcpy(ss->name,sizeof(ss->name),name.c_str()); + + ss->basetype=(uint8) type.basetype; + ss->vec_size= type.vec_size; + + return sdm.AddOutput(ss); +} + +int ShaderCreater::AddOutput(const AnsiString &type,const AnsiString &name) +{ + VAT vat; + + if(!ParseVertexAttribType(&vat,type)) + return(-2); + + return AddOutput(vat,name); +} + +bool ShaderCreater::AddFunction(const AnsiString &return_type,const AnsiString &func_name,const AnsiString ¶m_list,const AnsiString &codes) +{ + //return sdm.AddFunction(return_type,func_name,param_list,code); +} +SHADERGEN_NAMESPACE_END \ No newline at end of file diff --git a/src/ShaderGen/ShaderCreaterFragment.cpp b/src/ShaderGen/ShaderCreaterFragment.cpp new file mode 100644 index 00000000..6dd2461a --- /dev/null +++ b/src/ShaderGen/ShaderCreaterFragment.cpp @@ -0,0 +1,23 @@ +#include + +SHADERGEN_NAMESPACE_BEGIN + +void ShaderCreaterFragment::UseDefaultMain() +{ + main_codes="void main()\n{\n"; + + const auto &output_list=sdm.GetShaderStageIO().output; + + const uint count=output_list.GetCount(); + for(uint i=0;iname; + main_codes+="=Get"; + main_codes+=output_list[i]->name; + main_codes+="();\n"; + } + + main_codes+="}"; +} +SHADERGEN_NAMESPACE_END \ No newline at end of file diff --git a/src/ShaderGen/ShaderCreaterGeometry.cpp b/src/ShaderGen/ShaderCreaterGeometry.cpp new file mode 100644 index 00000000..e69de29b diff --git a/src/ShaderGen/ShaderCreaterVertex.cpp b/src/ShaderGen/ShaderCreaterVertex.cpp new file mode 100644 index 00000000..50769943 --- /dev/null +++ b/src/ShaderGen/ShaderCreaterVertex.cpp @@ -0,0 +1,13 @@ +#include + +SHADERGEN_NAMESPACE_BEGIN + +void ShaderCreaterVertex::UseDefaultMain() +{ + main_codes=R"( +void main() +{ + gl_Position=GetPosition(); +})"; +} +SHADERGEN_NAMESPACE_END \ No newline at end of file