diff --git a/example/MaterialCreaterTest.cpp b/example/MaterialCreaterTest.cpp index 29ced328..8a569363 100644 --- a/example/MaterialCreaterTest.cpp +++ b/example/MaterialCreaterTest.cpp @@ -6,7 +6,7 @@ using namespace hgl::shadergen; bool PureColor2DMaterial() { - MaterialCreater mc(1); //一个新材质,1个RT输出,默认使用Vertex/Fragment shader + MaterialCreater mc(1,false); //一个新材质,1个RT输出,默认使用Vertex/Fragment shader //vertex部分 { @@ -14,7 +14,7 @@ bool PureColor2DMaterial() //以下代码会被展开为 /* - layout(location=?) in vec3 Position; //位置属性 + layout(location=?) in vec3 Position; //位置属性 */ vsc->AddInput("vec2","Position"); //添加一个vec3类型的position属性输入 @@ -61,12 +61,14 @@ void main() })"); } - mc.CompileShader(); + mc.CreateShader(); return(false); } -int MaterialCreaterTest() +int main() { + PureColor2DMaterial(); + return 0; } diff --git a/inc/hgl/shadergen/MaterialCreater.h b/inc/hgl/shadergen/MaterialCreater.h index 014b614c..4834774b 100644 --- a/inc/hgl/shadergen/MaterialCreater.h +++ b/inc/hgl/shadergen/MaterialCreater.h @@ -50,6 +50,6 @@ public: 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); - bool CompileShader(); + bool CreateShader(); };//class MaterialCreater SHADERGEN_NAMESPACE_END diff --git a/inc/hgl/shadergen/MaterialDescriptorManager.h b/inc/hgl/shadergen/MaterialDescriptorManager.h index 6adbc821..7b976dd7 100644 --- a/inc/hgl/shadergen/MaterialDescriptorManager.h +++ b/inc/hgl/shadergen/MaterialDescriptorManager.h @@ -44,9 +44,6 @@ public: bool AddStruct(const AnsiString &name,const AnsiString &code) { - if(struct_map.KeyExist(name)) - return(false); - struct_map.Add(name,code); return(true); } diff --git a/inc/hgl/shadergen/ShaderCreater.h b/inc/hgl/shadergen/ShaderCreater.h index 6bdd6a61..bcbd4675 100644 --- a/inc/hgl/shadergen/ShaderCreater.h +++ b/inc/hgl/shadergen/ShaderCreater.h @@ -62,6 +62,8 @@ public: bool CreateShader(ShaderCreater *); + const AnsiString &GetShaderSource()const{return final_shader;} + bool CompileToSPV(); };//class ShaderCreater SHADERGEN_NAMESPACE_END diff --git a/inc/hgl/shadergen/ShaderDescriptorManager.h b/inc/hgl/shadergen/ShaderDescriptorManager.h index 8b75606d..6f830a16 100644 --- a/inc/hgl/shadergen/ShaderDescriptorManager.h +++ b/inc/hgl/shadergen/ShaderDescriptorManager.h @@ -20,7 +20,7 @@ class ShaderDescriptorManager VkShaderStageFlagBits shader_stage; ShaderStageIO stage_io; - + AnsiStringList struct_list; //用到的结构列表 //ubo/object在这里以及MaterialDescriptorManager中均有一份,mdm中的用于产生set/binding号,这里的用于产生shader @@ -39,7 +39,7 @@ public: const VkShaderStageFlagBits GetStageBits()const { return shader_stage; } const AnsiString GetStageName()const { return AnsiString(GetShaderStageName(shader_stage)); } - + public: const ShaderStageIO & GetShaderStageIO()const{return stage_io;} @@ -51,8 +51,8 @@ public: const ObjectList & GetConstList()const{return const_value_list;} - const ObjectList & GetSubpassInputList()const { return subpass_input; } - + const ObjectList & GetSubpassInputList()const{return subpass_input;} + public: bool AddInput(ShaderStage *); diff --git a/src/ShaderGen/MaterialCreater.cpp b/src/ShaderGen/MaterialCreater.cpp index abd68b70..efd28905 100644 --- a/src/ShaderGen/MaterialCreater.cpp +++ b/src/ShaderGen/MaterialCreater.cpp @@ -95,25 +95,27 @@ bool MaterialCreater::AddSampler(const VkShaderStageFlagBits flag_bit,const Desc } } -bool MaterialCreater::CompileShader() +bool MaterialCreater::CreateShader() { if(shader_map.IsEmpty()) return(false); + //mdm.Resort(); + ShaderCreater *sc,*last=nullptr; - for(int i=0;iCreateShader(last); + // sc->CreateShader(last); - //if(!sc->CompileToSPV()) - //return(false); + // last=sc; + //} - last=sc; - } + //vert->CreateShader(nullptr); + frag->CreateShader(vert); return(true); } diff --git a/src/ShaderGen/MaterialDescriptorManager.cpp b/src/ShaderGen/MaterialDescriptorManager.cpp index f973d3df..0aba71ea 100644 --- a/src/ShaderGen/MaterialDescriptorManager.cpp +++ b/src/ShaderGen/MaterialDescriptorManager.cpp @@ -43,7 +43,7 @@ ShaderDescriptor *MaterialDescriptorManager::ShaderDescriptorSet::AddDescriptor( new_sd->set_type=set_type; new_sd->stage_flag=ssb; - descriptor_map.Add(new_sd->name, new_sd); + descriptor_map.Add(new_sd->name,new_sd); count++; diff --git a/src/ShaderGen/ShaderCreater.cpp b/src/ShaderGen/ShaderCreater.cpp index 7e2bf302..8d7e9caf 100644 --- a/src/ShaderGen/ShaderCreater.cpp +++ b/src/ShaderGen/ShaderCreater.cpp @@ -34,8 +34,8 @@ bool ShaderCreater::ProcSubpassInput() if(sil.IsEmpty()) return(true); - const auto si=sil.GetData(); - const int si_count=sil.GetCount(); + auto si=sil.GetData(); + int si_count=sil.GetCount(); for(int i=0;iname; final_shader+=";\n"; + + ++si; } final_shader+="\n"; @@ -73,14 +75,16 @@ bool ShaderCreater::ProcInput(ShaderCreater *last_sc) bool ShaderCreater::ProcOutput() { - final_shader+="layout(location=0) out "; - output_struct.Clear(); + const ShaderStageList &ssl=sdm.GetShaderStageIO().output; + + if(ssl.GetCount()<=0)return(true); + output_struct=GetShaderStageName(shader_stage); output_struct+="_Output\n{\n"; - for(auto *ss:sdm.GetShaderStageIO().output) + for(auto *ss:ssl) { output_struct+="\t"; output_struct+=GetShaderStageTypeName(ss); @@ -91,6 +95,7 @@ bool ShaderCreater::ProcOutput() output_struct+="}"; + final_shader+="layout(location=0) out "; final_shader+=output_struct; final_shader+="Output;\n\n"; @@ -112,7 +117,7 @@ bool ShaderCreater::ProcStruct() final_shader+=*str; final_shader+="\n{\n"; final_shader+=codes; - final_shader+="};\n\n"; + final_shader+="\n};\n\n"; } return(true); @@ -153,7 +158,8 @@ bool ShaderCreater::ProcSSBO() } bool ShaderCreater::ProcConst() -{auto const_list=sdm.GetConstList(); +{ + auto const_list=sdm.GetConstList(); const int count=const_list.GetCount(); @@ -220,14 +226,14 @@ bool ShaderCreater::CreateShader(ShaderCreater *last_sc) if(!ProcStruct()) return(false); - if(!ProcUBO()) - return(false); - //if(!ProcSSBO()) - //return(false); - if(!ProcConst()) - return(false); - if(!ProcSampler()) - return(false); + //if(!ProcUBO()) + // return(false); + ////if(!ProcSSBO()) + // //return(false); + //if(!ProcConst()) + // return(false); + //if(!ProcSampler()) + // return(false); ProcOutput(); diff --git a/src/ShaderGen/ShaderCreaterVertex.cpp b/src/ShaderGen/ShaderCreaterVertex.cpp index c2640d77..9e05ddaf 100644 --- a/src/ShaderGen/ShaderCreaterVertex.cpp +++ b/src/ShaderGen/ShaderCreaterVertex.cpp @@ -41,7 +41,7 @@ bool ShaderCreaterVertex::ProcInput(ShaderCreater *) final_shader+=UTF8String::numberOf(ss->location); final_shader+=") in "; final_shader+=UTF8String(GetShaderStageTypeName(ss)); - final_shader+="\t"+UTF8String(ss->name); + final_shader+=" "+UTF8String(ss->name); final_shader+=";\n"; }