optmized layout of shadergen

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-03-06 21:30:32 +08:00
parent 6b8e76b75f
commit eed16928e9
6 changed files with 52 additions and 71 deletions

View File

@ -4,7 +4,7 @@ using namespace hgl;
using namespace hgl::graph; using namespace hgl::graph;
using namespace hgl::shadergen; using namespace hgl::shadergen;
bool PureColorMaterial() bool PureColor2DMaterial()
{ {
MaterialCreater mc(1); //一个新材质1个RT输出默认使用Vertex/Fragment shader MaterialCreater mc(1); //一个新材质1个RT输出默认使用Vertex/Fragment shader
@ -16,25 +16,15 @@ bool PureColorMaterial()
/* /*
layout(location=?) in vec3 Position; //位置属性 layout(location=?) in vec3 Position; //位置属性
*/ */
vsc->AddInput("vec3","Position"); //添加一个vec3类型的position属性输入 vsc->AddInput("vec2","Position"); //添加一个vec3类型的position属性输入
//以下代码会被展开为 vsc->SetShaderCodes(R"(
/* void main()
vec3 GetPosition(void) {
{ gl_Position=vec4(Position,0,1);
return Position; })");
}
*/
vsc->AddFunction("vec3","GetPosition","void","return Position;");
//使用缺省main函数会产生如下代码 vsc->CompileToSPV();
/*
void main()
{
gl_Position=GetPosition();
}
*/
vsc->UseDefaultMain();
} }
//添加一个名称为ColorMaterial的UBO定义,其内部有一个vec4 color的属性 //添加一个名称为ColorMaterial的UBO定义,其内部有一个vec4 color的属性
@ -60,24 +50,17 @@ bool PureColorMaterial()
{ {
ShaderCreaterFragment *fsc=mc.GetFS(); //获取fragment shader creater ShaderCreaterFragment *fsc=mc.GetFS(); //获取fragment shader creater
//以下代码会被合并成 vec4 GetColor(/**/){return mtl.color;}
fsc->AddFunction("vec4","GetColor","/**/","return mtl.color;");
//以下代码会被展开为 //以下代码会被展开为
/* /*
layout(location=?) out vec4 Color; //颜色输出 layout(location=?) out vec4 Color; //颜色输出
*/ */
fsc->AddOutput("vec4","Color"); //添加一个vec4类型的color属性输出 fsc->AddOutput("vec4","Color"); //添加一个vec4类型的color属性输出
//同时如果拥有多个输出会直接根据输出的数量DefaultMain会根据对应的Output名称要求GetXXX()函数
//使用缺省main函数会产生如下代码 fsc->SetShaderCodes(R"(
/* void main()
void main() {
{ Color=mtl.color;
Color=GetColor(); })");
}
*/
fsc->UseDefaultMain();
} }
return(false); return(false);

View File

@ -10,7 +10,7 @@ class ShaderCreater
protected: protected:
AnsiString main_codes; AnsiString shader_codes;
public: public:
@ -27,13 +27,15 @@ public:
virtual ~ShaderCreater()=default; 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 VAT &type,const AnsiString &name);
int AddOutput(const AnsiString &type,const AnsiString &name); int AddOutput(const AnsiString &type,const AnsiString &name);
bool AddFunction(const AnsiString &return_type,const AnsiString &func_name,const AnsiString &param_list,const AnsiString &codes); void SetShaderCodes(const AnsiString &str)
{
shader_codes;
}
bool CompileToSPV();
};//class ShaderCreater };//class ShaderCreater
SHADERGEN_NAMESPACE_END SHADERGEN_NAMESPACE_END
#endif//HGL_SHADER_CREATER_INCLUDE #endif//HGL_SHADER_CREATER_INCLUDE

View File

@ -3,6 +3,11 @@
#include<hgl/shadergen/ShaderCreater.h> #include<hgl/shadergen/ShaderCreater.h>
SHADERGEN_NAMESPACE_BEGIN SHADERGEN_NAMESPACE_BEGIN
enum class MaterialType
{
Color, ///<曾伎第窐
};
class ShaderCreaterFragment:public ShaderCreater class ShaderCreaterFragment:public ShaderCreater
{ {
public: public:

View File

@ -10,6 +10,8 @@ public:
ShaderCreaterVertex():ShaderCreater(VK_SHADER_STAGE_VERTEX_BIT){} ShaderCreaterVertex():ShaderCreater(VK_SHADER_STAGE_VERTEX_BIT){}
~ShaderCreaterVertex()=default; ~ShaderCreaterVertex()=default;
void UseDefaultMain(); int AddInput(const VAT &type,const AnsiString &name);
int AddInput(const AnsiString &type,const AnsiString &name);
}; };
SHADERGEN_NAMESPACE_END SHADERGEN_NAMESPACE_END

View File

@ -1,28 +1,6 @@
#include<hgl/shadergen/ShaderCreater.h> #include<hgl/shadergen/ShaderCreater.h>
SHADERGEN_NAMESPACE_BEGIN 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) int ShaderCreater::AddOutput(const VAT &type,const AnsiString &name)
{ {
ShaderStage *ss=new ShaderStage; ShaderStage *ss=new ShaderStage;
@ -45,8 +23,7 @@ int ShaderCreater::AddOutput(const AnsiString &type,const AnsiString &name)
return AddOutput(vat,name); return AddOutput(vat,name);
} }
bool ShaderCreater::AddFunction(const AnsiString &return_type,const AnsiString &func_name,const AnsiString &param_list,const AnsiString &codes) bool ShaderCreater::CompileToSPV()
{ {
//return sdm.AddFunction(return_type,func_name,param_list,code);
} }
SHADERGEN_NAMESPACE_END SHADERGEN_NAMESPACE_END

View File

@ -1,13 +1,25 @@
#include<hgl/shadergen/ShaderCreaterVertex.h> #include<hgl/shadergen/ShaderCreaterVertex.h>
SHADERGEN_NAMESPACE_BEGIN SHADERGEN_NAMESPACE_BEGIN
int ShaderCreaterVertex::AddInput(const VAT &type,const AnsiString &name)
{
ShaderStage *ss=new ShaderStage;
void ShaderCreaterVertex::UseDefaultMain() hgl::strcpy(ss->name,sizeof(ss->name),name.c_str());
{
main_codes=R"( ss->basetype=(uint8) type.basetype;
void main() ss->vec_size= type.vec_size;
{
gl_Position=GetPosition(); return sdm.AddInput(ss);
})";
} }
SHADERGEN_NAMESPACE_END
int ShaderCreaterVertex::AddInput(const AnsiString &type,const AnsiString &name)
{
VAT vat;
if(!ParseVertexAttribType(&vat,type))
return(-2);
return AddInput(vat,name);
}
SHADERGEN_NAMESPACE_END