From eed16928e94bde8ffa136538a9cf4759bff7a251 Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Mon, 6 Mar 2023 21:30:32 +0800 Subject: [PATCH] optmized layout of shadergen --- example/MaterialCreaterTest.cpp | 43 +++++++---------------- inc/hgl/shadergen/ShaderCreater.h | 14 ++++---- inc/hgl/shadergen/ShaderCreaterFragment.h | 5 +++ inc/hgl/shadergen/ShaderCreaterVertex.h | 6 ++-- src/ShaderGen/ShaderCreater.cpp | 27 ++------------ src/ShaderGen/ShaderCreaterVertex.cpp | 28 ++++++++++----- 6 files changed, 52 insertions(+), 71 deletions(-) diff --git a/example/MaterialCreaterTest.cpp b/example/MaterialCreaterTest.cpp index 9ab29b79..a957c412 100644 --- a/example/MaterialCreaterTest.cpp +++ b/example/MaterialCreaterTest.cpp @@ -4,7 +4,7 @@ using namespace hgl; using namespace hgl::graph; using namespace hgl::shadergen; -bool PureColorMaterial() +bool PureColor2DMaterial() { MaterialCreater mc(1); //一个新材质,1个RT输出,默认使用Vertex/Fragment shader @@ -16,25 +16,15 @@ bool PureColorMaterial() /* layout(location=?) in vec3 Position; //位置属性 */ - vsc->AddInput("vec3","Position"); //添加一个vec3类型的position属性输入 + vsc->AddInput("vec2","Position"); //添加一个vec3类型的position属性输入 - //以下代码会被展开为 - /* - vec3 GetPosition(void) - { - return Position; - } - */ - vsc->AddFunction("vec3","GetPosition","void","return Position;"); + vsc->SetShaderCodes(R"( +void main() +{ + gl_Position=vec4(Position,0,1); +})"); - //使用缺省main函数,会产生如下代码 - /* - void main() - { - gl_Position=GetPosition(); - } - */ - vsc->UseDefaultMain(); + vsc->CompileToSPV(); } //添加一个名称为ColorMaterial的UBO定义,其内部有一个vec4 color的属性 @@ -60,24 +50,17 @@ bool PureColorMaterial() { 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(); + fsc->SetShaderCodes(R"( +void main() +{ + Color=mtl.color; +})"); } return(false); diff --git a/inc/hgl/shadergen/ShaderCreater.h b/inc/hgl/shadergen/ShaderCreater.h index 866da4cd..c9cf1398 100644 --- a/inc/hgl/shadergen/ShaderCreater.h +++ b/inc/hgl/shadergen/ShaderCreater.h @@ -10,7 +10,7 @@ class ShaderCreater protected: - AnsiString main_codes; + AnsiString shader_codes; public: @@ -27,13 +27,15 @@ public: 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); + void SetShaderCodes(const AnsiString &str) + { + shader_codes; + } + + bool CompileToSPV(); };//class ShaderCreater SHADERGEN_NAMESPACE_END -#endif//HGL_SHADER_CREATER_INCLUDE \ No newline at end of file +#endif//HGL_SHADER_CREATER_INCLUDE diff --git a/inc/hgl/shadergen/ShaderCreaterFragment.h b/inc/hgl/shadergen/ShaderCreaterFragment.h index 78f45f10..67154682 100644 --- a/inc/hgl/shadergen/ShaderCreaterFragment.h +++ b/inc/hgl/shadergen/ShaderCreaterFragment.h @@ -3,6 +3,11 @@ #include SHADERGEN_NAMESPACE_BEGIN +enum class MaterialType +{ + Color, ///<ɫ +}; + class ShaderCreaterFragment:public ShaderCreater { public: diff --git a/inc/hgl/shadergen/ShaderCreaterVertex.h b/inc/hgl/shadergen/ShaderCreaterVertex.h index 9f0913df..c13f7add 100644 --- a/inc/hgl/shadergen/ShaderCreaterVertex.h +++ b/inc/hgl/shadergen/ShaderCreaterVertex.h @@ -10,6 +10,8 @@ public: ShaderCreaterVertex():ShaderCreater(VK_SHADER_STAGE_VERTEX_BIT){} ~ShaderCreaterVertex()=default; - void UseDefaultMain(); + int AddInput(const VAT &type,const AnsiString &name); + int AddInput(const AnsiString &type,const AnsiString &name); + }; -SHADERGEN_NAMESPACE_END \ No newline at end of file +SHADERGEN_NAMESPACE_END diff --git a/src/ShaderGen/ShaderCreater.cpp b/src/ShaderGen/ShaderCreater.cpp index 2b8d6004..0e248c49 100644 --- a/src/ShaderGen/ShaderCreater.cpp +++ b/src/ShaderGen/ShaderCreater.cpp @@ -1,28 +1,6 @@ #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; @@ -45,8 +23,7 @@ int ShaderCreater::AddOutput(const AnsiString &type,const AnsiString &name) return AddOutput(vat,name); } -bool ShaderCreater::AddFunction(const AnsiString &return_type,const AnsiString &func_name,const AnsiString ¶m_list,const AnsiString &codes) +bool ShaderCreater::CompileToSPV() { - //return sdm.AddFunction(return_type,func_name,param_list,code); } -SHADERGEN_NAMESPACE_END \ No newline at end of file +SHADERGEN_NAMESPACE_END diff --git a/src/ShaderGen/ShaderCreaterVertex.cpp b/src/ShaderGen/ShaderCreaterVertex.cpp index 50769943..a988d2d5 100644 --- a/src/ShaderGen/ShaderCreaterVertex.cpp +++ b/src/ShaderGen/ShaderCreaterVertex.cpp @@ -1,13 +1,25 @@ #include SHADERGEN_NAMESPACE_BEGIN +int ShaderCreaterVertex::AddInput(const VAT &type,const AnsiString &name) +{ + ShaderStage *ss=new ShaderStage; -void ShaderCreaterVertex::UseDefaultMain() -{ - main_codes=R"( -void main() -{ - gl_Position=GetPosition(); -})"; + 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); } -SHADERGEN_NAMESPACE_END \ No newline at end of file + +int ShaderCreaterVertex::AddInput(const AnsiString &type,const AnsiString &name) +{ + VAT vat; + + if(!ParseVertexAttribType(&vat,type)) + return(-2); + + return AddInput(vat,name); +} +SHADERGEN_NAMESPACE_END