diff --git a/example/MaterialCreaterTest.cpp b/example/MaterialCreaterTest.cpp index 1bb82450..29ced328 100644 --- a/example/MaterialCreaterTest.cpp +++ b/example/MaterialCreaterTest.cpp @@ -33,7 +33,7 @@ void main() vec4 color; }; */ - mc.AddUBOStruct("ColorMaterial","vec4 color;"); + mc.AddStruct("ColorMaterial","vec4 color;"); //添加一个UBO,该代码会被展开为 /* diff --git a/inc/hgl/shadergen/MaterialCreater.h b/inc/hgl/shadergen/MaterialCreater.h index acc30f4b..d6fbe130 100644 --- a/inc/hgl/shadergen/MaterialCreater.h +++ b/inc/hgl/shadergen/MaterialCreater.h @@ -42,7 +42,7 @@ 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 AddStruct(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); diff --git a/inc/hgl/shadergen/MaterialDescriptorManager.h b/inc/hgl/shadergen/MaterialDescriptorManager.h index 5d2e91ef..6adbc821 100644 --- a/inc/hgl/shadergen/MaterialDescriptorManager.h +++ b/inc/hgl/shadergen/MaterialDescriptorManager.h @@ -33,7 +33,7 @@ class MaterialDescriptorManager ShaderDescriptorSetArray desc_set_array; - Map ubo_struct_map; + Map struct_map; Map ubo_map; Map sampler_map; @@ -42,23 +42,23 @@ public: MaterialDescriptorManager(); ~MaterialDescriptorManager()=default; - bool AddUBOStruct(const AnsiString &name,const AnsiString &code) + bool AddStruct(const AnsiString &name,const AnsiString &code) { - if(ubo_struct_map.KeyExist(name)) + if(struct_map.KeyExist(name)) return(false); - ubo_struct_map.Add(name,code); + struct_map.Add(name,code); return(true); } - bool GetUBOStruct(const AnsiString &name,AnsiString &code) const + bool GetStruct(const AnsiString &name,AnsiString &code) const { - return(ubo_struct_map.Get(name,code)); + return(struct_map.Get(name,code)); } - bool hasUBOStruct(const AnsiString &name) const + bool hasStruct(const AnsiString &name) const { - return(ubo_struct_map.KeyExist(name)); + return(struct_map.KeyExist(name)); } const UBODescriptor *AddUBO(VkShaderStageFlagBits ssb,DescriptorSetType set_type,UBODescriptor *sd); diff --git a/inc/hgl/shadergen/ShaderCreater.h b/inc/hgl/shadergen/ShaderCreater.h index 4a5c1420..1b5668f4 100644 --- a/inc/hgl/shadergen/ShaderCreater.h +++ b/inc/hgl/shadergen/ShaderCreater.h @@ -6,8 +6,12 @@ SHADERGEN_NAMESPACE_BEGIN class ShaderCreater { +protected: + VkShaderStageFlagBits shader_stage; ///<着色器阶段 + MaterialDescriptorManager *mdm; + protected: AnsiString shader_codes; @@ -18,9 +22,16 @@ protected: protected: - virtual void ProcHeader(){} - virtual void ProcInput(); - virtual void ProcOutput(); + virtual bool ProcHeader(){return(true);} + virtual bool ProcSubpassInput(); + virtual bool ProcInput(ShaderCreater *); + virtual bool ProcOutput(); + + virtual bool ProcStruct(); + + virtual bool ProcUBO(); + virtual bool ProcSSBO(); + virtual bool ProcConst(); public: @@ -30,9 +41,10 @@ public: public: - ShaderCreater(VkShaderStageFlagBits ss):sdm(ss) + ShaderCreater(VkShaderStageFlagBits ss,MaterialDescriptorManager *m):sdm(ss) { shader_stage=ss; + mdm=m; } virtual ~ShaderCreater()=default; diff --git a/inc/hgl/shadergen/ShaderCreaterFragment.h b/inc/hgl/shadergen/ShaderCreaterFragment.h index 67154682..295b9e8a 100644 --- a/inc/hgl/shadergen/ShaderCreaterFragment.h +++ b/inc/hgl/shadergen/ShaderCreaterFragment.h @@ -12,7 +12,7 @@ class ShaderCreaterFragment:public ShaderCreater { public: - ShaderCreaterFragment():ShaderCreater(VK_SHADER_STAGE_FRAGMENT_BIT){} + ShaderCreaterFragment(MaterialDescriptorManager *m):ShaderCreater(VK_SHADER_STAGE_FRAGMENT_BIT,m){} ~ShaderCreaterFragment()=default; void UseDefaultMain(); diff --git a/inc/hgl/shadergen/ShaderCreaterGeometry.h b/inc/hgl/shadergen/ShaderCreaterGeometry.h index cfa749af..086298c6 100644 --- a/inc/hgl/shadergen/ShaderCreaterGeometry.h +++ b/inc/hgl/shadergen/ShaderCreaterGeometry.h @@ -7,7 +7,7 @@ class ShaderCreaterGeometry:public ShaderCreater { public: - ShaderCreaterGeometry():ShaderCreater(VK_SHADER_STAGE_GEOMETRY_BIT){} + ShaderCreaterGeometry(MaterialDescriptorManager *m):ShaderCreater(VK_SHADER_STAGE_GEOMETRY_BIT,m){} ~ShaderCreaterGeometry()=default; }; SHADERGEN_NAMESPACE_END \ No newline at end of file diff --git a/inc/hgl/shadergen/ShaderCreaterVertex.h b/inc/hgl/shadergen/ShaderCreaterVertex.h index d9906f75..9ed819d2 100644 --- a/inc/hgl/shadergen/ShaderCreaterVertex.h +++ b/inc/hgl/shadergen/ShaderCreaterVertex.h @@ -9,7 +9,7 @@ class ShaderCreaterVertex:public ShaderCreater public: - ShaderCreaterVertex():ShaderCreater(VK_SHADER_STAGE_VERTEX_BIT){} + ShaderCreaterVertex(MaterialDescriptorManager *m):ShaderCreater(VK_SHADER_STAGE_VERTEX_BIT,m){} ~ShaderCreaterVertex()=default; int AddInput(const VAT &type,const AnsiString &name); diff --git a/inc/hgl/shadergen/ShaderDescriptorManager.h b/inc/hgl/shadergen/ShaderDescriptorManager.h index 8e1b10a5..8b75606d 100644 --- a/inc/hgl/shadergen/ShaderDescriptorManager.h +++ b/inc/hgl/shadergen/ShaderDescriptorManager.h @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -20,6 +21,8 @@ class ShaderDescriptorManager ShaderStageIO stage_io; + AnsiStringList struct_list; //用到的结构列表 + //ubo/object在这里以及MaterialDescriptorManager中均有一份,mdm中的用于产生set/binding号,这里的用于产生shader ConstUBODescriptorList ubo_list; ConstSamplerDescriptorList sampler_list; @@ -41,6 +44,8 @@ public: const ShaderStageIO & GetShaderStageIO()const{return stage_io;} + const AnsiStringList & GetStructList()const{return struct_list;} + const ConstUBODescriptorList & GetUBOList()const{return ubo_list;} const ConstSamplerDescriptorList & GetSamplerList()const{return sampler_list;} diff --git a/src/ShaderGen/MaterialCreater.cpp b/src/ShaderGen/MaterialCreater.cpp index 56a4d651..58918e01 100644 --- a/src/ShaderGen/MaterialCreater.cpp +++ b/src/ShaderGen/MaterialCreater.cpp @@ -9,17 +9,17 @@ MaterialCreater::MaterialCreater(const uint rc,const uint32 ss) rt_count=rc; shader_stage=ss; - 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; + if(hasVertex ())shader_map.Add(vert=new ShaderCreaterVertex (&mdm));else vert=nullptr; + if(hasGeometry ())shader_map.Add(geom=new ShaderCreaterGeometry(&mdm));else geom=nullptr; + if(hasFragment ())shader_map.Add(frag=new ShaderCreaterFragment(&mdm));else frag=nullptr; } -bool MaterialCreater::AddUBOStruct(const AnsiString &ubo_typename,const AnsiString &codes) +bool MaterialCreater::AddStruct(const AnsiString &struct_name,const AnsiString &codes) { - if(ubo_typename.IsEmpty()||codes.IsEmpty()) + if(struct_name.IsEmpty()||codes.IsEmpty()) return(false); - return mdm.AddUBOStruct(ubo_typename,codes); + return mdm.AddStruct(struct_name,codes); } bool MaterialCreater::AddUBO(const VkShaderStageFlagBits flag_bit,const DescriptorSetType set_type,const AnsiString &type_name,const AnsiString &name) @@ -27,7 +27,7 @@ bool MaterialCreater::AddUBO(const VkShaderStageFlagBits flag_bit,const Descript if(!shader_map.KeyExist(flag_bit)) return(false); - if(!mdm.hasUBOStruct(type_name)) + if(!mdm.hasStruct(type_name)) return(false); ShaderCreater *sc=shader_map[flag_bit]; diff --git a/src/ShaderGen/ShaderCreater.cpp b/src/ShaderGen/ShaderCreater.cpp index a2341bf6..87c4b53b 100644 --- a/src/ShaderGen/ShaderCreater.cpp +++ b/src/ShaderGen/ShaderCreater.cpp @@ -26,19 +26,35 @@ int ShaderCreater::AddOutput(const AnsiString &type,const AnsiString &name) return AddOutput(vat,name); } -void ShaderCreater::ProcInput() +bool ShaderCreater::ProcSubpassInput() { - + } -void ShaderCreater::ProcOutput() +bool ShaderCreater::ProcInput(ShaderCreater *last_sc) +{ + if(!last_sc) + return; + + AnsiString last_output=last_sc->GetOutputStruct(); + + if(last_output.IsEmpty()) + return; + + final_shader+="layout(location=0) in "; + final_shader+=last_output; + final_shader+="Input;\n\n"; +} + +bool ShaderCreater::ProcOutput() { final_shader+="layout(location=0) out "; - final_shader+=GetShaderStageName(shader_stage); - final_shader+="_Output\n{"; output_struct.Clear(); + output_struct=GetShaderStageName(shader_stage); + output_struct+="_Output\n{\n"; + for(auto *ss:sdm.GetShaderStageIO().output) { output_struct+="\t"; @@ -48,15 +64,47 @@ void ShaderCreater::ProcOutput() output_struct+=";\n"; } + output_struct+="}"; + final_shader+=output_struct; - final_shader+="}Output;\n\n"; + final_shader+="Output;\n\n"; +} + +bool ShaderCreater::ProcStruct() +{ + const AnsiStringList struct_list=sdm.GetStructList(); + + AnsiString codes; + + for(const AnsiString &str:struct_list) + { + if(!mdm->GetStruct(str,codes)) + return(false); + + } + + return(true); +} + +bool ShaderCreater::ProcUBO() +{ +} + +bool ShaderCreater::ProcSSBO() +{ +} + +bool ShaderCreater::ProcConst() +{ } bool ShaderCreater::CreateShader(ShaderCreater *last_sc) { final_shader="#version 460 core\n"; - + ProcInput(last_sc); + + ProcOutput(); } bool ShaderCreater::CompileToSPV() diff --git a/src/ShaderGen/ShaderDescriptorManager.cpp b/src/ShaderGen/ShaderDescriptorManager.cpp index 46b54b58..0647a94f 100644 --- a/src/ShaderGen/ShaderDescriptorManager.cpp +++ b/src/ShaderGen/ShaderDescriptorManager.cpp @@ -47,6 +47,8 @@ bool ShaderDescriptorManager::AddUBO(DescriptorSetType type,const UBODescriptor if(!ubo) return(false); + struct_list.AddUnique(ubo->type); + ubo_list.Add(ubo); return true; }