completed MaterialInstance codes in ShaderGen

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-06-01 14:47:05 +08:00
parent 1668a0c973
commit a04742c347
8 changed files with 69 additions and 28 deletions

View File

@ -10,11 +10,11 @@ constexpr const ShaderBufferSource SBS_ViewportInfo=
"viewport", "viewport",
R"( R"(
mat4 ortho_matrix; mat4 ortho_matrix;
vec2 canvas_resolution; vec2 canvas_resolution;
vec2 viewport_resolution; vec2 viewport_resolution;
vec2 inv_viewport_resolution; vec2 inv_viewport_resolution;
)" )"
}; };
@ -24,22 +24,22 @@ constexpr const ShaderBufferSource SBS_CameraInfo=
"camera", "camera",
R"( R"(
mat4 projection; mat4 projection;
mat4 inverse_projection; mat4 inverse_projection;
mat4 view; mat4 view;
mat4 inverse_view; mat4 inverse_view;
mat4 vp; mat4 vp;
mat4 inverse_vp; mat4 inverse_vp;
mat4 sky; mat4 sky;
vec3 pos; //eye vec3 pos; //eye
vec3 view_line; //pos-target vec3 view_line; //pos-target
vec3 world_up; vec3 world_up;
float znear,zfar;)" float znear,zfar;)"
}; };
constexpr const char MaterialInstanceStruct[]="MaterialInstance"; constexpr const char MaterialInstanceStruct[]="MaterialInstance";
@ -49,7 +49,8 @@ constexpr const ShaderBufferSource SBS_MaterialInstanceData=
"MaterialInstanceData", "MaterialInstanceData",
"mtl", "mtl",
"MaterialInstance mi[256];" R"(
MaterialInstance mi[256];)"
}; };
constexpr const ShaderBufferSource SBS_JointInfo= constexpr const ShaderBufferSource SBS_JointInfo=

View File

@ -27,6 +27,8 @@ protected:
AnsiString output_struct; AnsiString output_struct;
AnsiString mi_codes;
AnsiStringList function_list; AnsiStringList function_list;
AnsiString main_function; AnsiString main_function;
@ -43,6 +45,8 @@ protected:
virtual bool ProcStruct(); virtual bool ProcStruct();
virtual bool ProcMI();
virtual bool ProcUBO(); virtual bool ProcUBO();
virtual bool ProcSSBO(); virtual bool ProcSSBO();
virtual bool ProcConst(); virtual bool ProcConst();
@ -66,7 +70,7 @@ public:
void AddFunction(const AnsiString &str){function_list.Add(str);} void AddFunction(const AnsiString &str){function_list.Add(str);}
void SetMaterialInstance(UBODescriptor *); void SetMaterialInstance(UBODescriptor *,const AnsiString &);
void SetMain(const AnsiString &str){main_function=str;} void SetMain(const AnsiString &str){main_function=str;}

View File

@ -11,7 +11,7 @@ namespace
constexpr const char vs_main[]=R"( constexpr const char vs_main[]=R"(
void main() void main()
{ {
HandoverMI(); //交接材质实例ID给下一个Shader HandoverMI();
gl_Position=GetPosition2D(); gl_Position=GetPosition2D();
})"; })";
@ -31,12 +31,8 @@ void main()
{ {
public: public:
MaterialPureColor2D(const Material2DConfig *c):Std2DMaterial(c) using Std2DMaterial::Std2DMaterial;
{
mci->SetMaterialInstance( mi_codes, //材质实例glsl代码
mi_bytes, //材质实例数据大小
VK_SHADER_STAGE_FRAGMENT_BIT); //只在Fragment Shader中使用材质实例最终数据
}
~MaterialPureColor2D()=default; ~MaterialPureColor2D()=default;
bool CreateVertexShader(ShaderCreateInfoVertex *vsc) override bool CreateVertexShader(ShaderCreateInfoVertex *vsc) override
@ -55,6 +51,15 @@ void main()
fsc->SetMain(fs_main); fsc->SetMain(fs_main);
return(true); return(true);
} }
bool AfterCreateShader() override
{
mci->SetMaterialInstance( mi_codes, //材质实例glsl代码
mi_bytes, //材质实例数据大小
VK_SHADER_STAGE_FRAGMENT_BIT); //只在Fragment Shader中使用材质实例最终数据
return(true);
}
};//class MaterialPureColor2D:public Std2DMaterial };//class MaterialPureColor2D:public Std2DMaterial
}//namespace }//namespace

View File

@ -40,6 +40,9 @@ bool Std2DMaterial::CreateVertexShader(ShaderCreateInfoVertex *vsc)
MaterialCreateInfo *Std2DMaterial::Create() MaterialCreateInfo *Std2DMaterial::Create()
{ {
if(!BeforeCreateShader())
return(nullptr);
if(mci->hasVertex()) if(mci->hasVertex())
if(!CreateVertexShader(mci->GetVS())) if(!CreateVertexShader(mci->GetVS()))
return(nullptr); return(nullptr);
@ -52,6 +55,9 @@ MaterialCreateInfo *Std2DMaterial::Create()
if(!CreateFragmentShader(mci->GetFS())) if(!CreateFragmentShader(mci->GetFS()))
return(nullptr); return(nullptr);
if(!AfterCreateShader())
return(false);
if(!mci->CreateShader()) if(!mci->CreateShader())
return(nullptr); return(nullptr);

View File

@ -25,10 +25,14 @@ namespace hgl
protected: protected:
virtual bool BeforeCreateShader(){return true;/*some work before creating shader*/};
virtual bool CreateVertexShader(ShaderCreateInfoVertex *); virtual bool CreateVertexShader(ShaderCreateInfoVertex *);
virtual bool CreateGeometryShader(ShaderCreateInfoGeometry *){return false;} virtual bool CreateGeometryShader(ShaderCreateInfoGeometry *){return false;}
virtual bool CreateFragmentShader(ShaderCreateInfoFragment *)=0; virtual bool CreateFragmentShader(ShaderCreateInfoFragment *)=0;
virtual bool AfterCreateShader(){return true;/*some work after creating shader*/};
public: public:
Std2DMaterial(const Material2DConfig *); Std2DMaterial(const Material2DConfig *);

View File

@ -4,6 +4,7 @@
#include<hgl/filesystem/FileSystem.h> #include<hgl/filesystem/FileSystem.h>
#include<vulkan/vulkan.h> #include<vulkan/vulkan.h>
#include<hgl/graph/VKPhysicalDevice.h> #include<hgl/graph/VKPhysicalDevice.h>
#include<hgl/log/Logger.h>
namespace hgl namespace hgl
{ {
@ -171,6 +172,8 @@ namespace hgl
if(!result) if(!result)
{ {
LOG_ERROR(U8_TEXT("Compile shader failed, error info: ")+UTF8String(spv->log));
FreeSPVData(spv); FreeSPVData(spv);
return(nullptr); return(nullptr);
} }

View File

@ -148,6 +148,7 @@ bool MaterialCreateInfo::SetMaterialInstance(const AnsiString &mi_glsl_codes,con
hgl::strcpy(ubo->name,DESCRIPTOR_NAME_MAX_LENGTH,SBS_MaterialInstanceData.name); hgl::strcpy(ubo->name,DESCRIPTOR_NAME_MAX_LENGTH,SBS_MaterialInstanceData.name);
ubo->stage_flag=shader_stage; ubo->stage_flag=shader_stage;
mdi.AddStruct(SBS_MaterialInstanceData.struct_name,SBS_MaterialInstanceData.codes);
mdi.AddUBO(shader_stage,DescriptorSetType::PerMaterial,ubo); mdi.AddUBO(shader_stage,DescriptorSetType::PerMaterial,ubo);
auto *it=shader_map.GetDataList(); auto *it=shader_map.GetDataList();
@ -155,7 +156,9 @@ bool MaterialCreateInfo::SetMaterialInstance(const AnsiString &mi_glsl_codes,con
for(int i=0;i<shader_map.GetCount();i++) for(int i=0;i<shader_map.GetCount();i++)
{ {
if((*it)->key&shader_stage) if((*it)->key&shader_stage)
(*it)->value->SetMaterialInstance(ubo); (*it)->value->SetMaterialInstance(ubo,mi_codes);
++it;
} }
vert->AddMaterialInstanceID(); //增加一个材质实例ID vert->AddMaterialInstanceID(); //增加一个材质实例ID

View File

@ -76,11 +76,13 @@ bool ShaderCreateInfo::ProcSubpassInput()
return(true); return(true);
} }
void ShaderCreateInfo::SetMaterialInstance(UBODescriptor *ubo) void ShaderCreateInfo::SetMaterialInstance(UBODescriptor *ubo,const AnsiString &mi)
{ {
sdm->AddUBO(DescriptorSetType::PerMaterial,ubo); sdm->AddUBO(DescriptorSetType::PerMaterial,ubo);
sdm->AddStruct(mtl::MaterialInstanceStruct); sdm->AddStruct(mtl::MaterialInstanceStruct);
AddFunction(mtl::func::GetMI); AddFunction(mtl::func::GetMI);
mi_codes=mi;
} }
bool ShaderCreateInfo::ProcInput(ShaderCreateInfo *last_sc) bool ShaderCreateInfo::ProcInput(ShaderCreateInfo *last_sc)
@ -120,7 +122,7 @@ bool ShaderCreateInfo::ProcOutput()
for(uint i=0;i<ssd.count;i++) for(uint i=0;i<ssd.count;i++)
{ {
output_struct+="\t"; output_struct+=" ";
if(ss->interpolation!=Interpolation::Smooth) if(ss->interpolation!=Interpolation::Smooth)
{ {
@ -167,6 +169,17 @@ bool ShaderCreateInfo::ProcStruct()
return(true); return(true);
} }
bool ShaderCreateInfo::ProcMI()
{
if(mi_codes.IsEmpty())
return(true);
final_shader+="struct MaterialInstance\n{\n";
final_shader+=mi_codes;
final_shader+="\n};\n";
return(true);
}
bool ShaderCreateInfo::ProcUBO() bool ShaderCreateInfo::ProcUBO()
{ {
auto ubo_list=sdm->GetUBOList(); auto ubo_list=sdm->GetUBOList();
@ -187,7 +200,7 @@ bool ShaderCreateInfo::ProcUBO()
final_shader+=AnsiString::numberOf((*ubo)->binding); final_shader+=AnsiString::numberOf((*ubo)->binding);
final_shader+=") uniform "; final_shader+=") uniform ";
final_shader+=(*ubo)->type; final_shader+=(*ubo)->type;
final_shader+="{\n"; final_shader+="\n{";
if(!mdi->GetStruct((*ubo)->type,struct_codes)) if(!mdi->GetStruct((*ubo)->type,struct_codes))
return(false); return(false);
@ -282,6 +295,8 @@ bool ShaderCreateInfo::CreateShader(ShaderCreateInfo *last_sc)
// if(!ProcStruct()) // if(!ProcStruct())
// return(false); // return(false);
ProcMI();
if(!ProcUBO()) if(!ProcUBO())
return(false); return(false);
//if(!ProcSSBO()) //if(!ProcSSBO())