From a04742c347c41d6289d9c78df408c520b48c8fcd Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Thu, 1 Jun 2023 14:47:05 +0800 Subject: [PATCH] completed MaterialInstance codes in ShaderGen --- inc/hgl/graph/mtl/UBOCommon.h | 33 ++++++++++++++-------------- inc/hgl/shadergen/ShaderCreateInfo.h | 6 ++++- src/ShaderGen/2d/PureColor2D.cpp | 19 ++++++++++------ src/ShaderGen/2d/Std2DMaterial.cpp | 6 +++++ src/ShaderGen/2d/Std2DMaterial.h | 4 ++++ src/ShaderGen/GLSLCompiler.cpp | 3 +++ src/ShaderGen/MaterialCreateInfo.cpp | 5 ++++- src/ShaderGen/ShaderCreateInfo.cpp | 21 +++++++++++++++--- 8 files changed, 69 insertions(+), 28 deletions(-) diff --git a/inc/hgl/graph/mtl/UBOCommon.h b/inc/hgl/graph/mtl/UBOCommon.h index 3ba10b56..ca62f6c1 100644 --- a/inc/hgl/graph/mtl/UBOCommon.h +++ b/inc/hgl/graph/mtl/UBOCommon.h @@ -10,11 +10,11 @@ constexpr const ShaderBufferSource SBS_ViewportInfo= "viewport", R"( -mat4 ortho_matrix; + mat4 ortho_matrix; -vec2 canvas_resolution; -vec2 viewport_resolution; -vec2 inv_viewport_resolution; + vec2 canvas_resolution; + vec2 viewport_resolution; + vec2 inv_viewport_resolution; )" }; @@ -24,22 +24,22 @@ constexpr const ShaderBufferSource SBS_CameraInfo= "camera", R"( -mat4 projection; -mat4 inverse_projection; + mat4 projection; + mat4 inverse_projection; -mat4 view; -mat4 inverse_view; + mat4 view; + mat4 inverse_view; -mat4 vp; -mat4 inverse_vp; + mat4 vp; + mat4 inverse_vp; -mat4 sky; + mat4 sky; -vec3 pos; //eye -vec3 view_line; //pos-target -vec3 world_up; + vec3 pos; //eye + vec3 view_line; //pos-target + vec3 world_up; -float znear,zfar;)" + float znear,zfar;)" }; constexpr const char MaterialInstanceStruct[]="MaterialInstance"; @@ -49,7 +49,8 @@ constexpr const ShaderBufferSource SBS_MaterialInstanceData= "MaterialInstanceData", "mtl", - "MaterialInstance mi[256];" + R"( + MaterialInstance mi[256];)" }; constexpr const ShaderBufferSource SBS_JointInfo= diff --git a/inc/hgl/shadergen/ShaderCreateInfo.h b/inc/hgl/shadergen/ShaderCreateInfo.h index df85544e..83c820ba 100644 --- a/inc/hgl/shadergen/ShaderCreateInfo.h +++ b/inc/hgl/shadergen/ShaderCreateInfo.h @@ -27,6 +27,8 @@ protected: AnsiString output_struct; + AnsiString mi_codes; + AnsiStringList function_list; AnsiString main_function; @@ -43,6 +45,8 @@ protected: virtual bool ProcStruct(); + virtual bool ProcMI(); + virtual bool ProcUBO(); virtual bool ProcSSBO(); virtual bool ProcConst(); @@ -66,7 +70,7 @@ public: 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;} diff --git a/src/ShaderGen/2d/PureColor2D.cpp b/src/ShaderGen/2d/PureColor2D.cpp index fc3d7fa7..70f11521 100644 --- a/src/ShaderGen/2d/PureColor2D.cpp +++ b/src/ShaderGen/2d/PureColor2D.cpp @@ -11,7 +11,7 @@ namespace constexpr const char vs_main[]=R"( void main() { - HandoverMI(); //交接材质实例ID给下一个Shader + HandoverMI(); gl_Position=GetPosition2D(); })"; @@ -31,12 +31,8 @@ void main() { public: - MaterialPureColor2D(const Material2DConfig *c):Std2DMaterial(c) - { - mci->SetMaterialInstance( mi_codes, //材质实例glsl代码 - mi_bytes, //材质实例数据大小 - VK_SHADER_STAGE_FRAGMENT_BIT); //只在Fragment Shader中使用材质实例最终数据 - } + using Std2DMaterial::Std2DMaterial; + ~MaterialPureColor2D()=default; bool CreateVertexShader(ShaderCreateInfoVertex *vsc) override @@ -55,6 +51,15 @@ void main() fsc->SetMain(fs_main); 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 }//namespace diff --git a/src/ShaderGen/2d/Std2DMaterial.cpp b/src/ShaderGen/2d/Std2DMaterial.cpp index a1505ec8..67b688f9 100644 --- a/src/ShaderGen/2d/Std2DMaterial.cpp +++ b/src/ShaderGen/2d/Std2DMaterial.cpp @@ -40,6 +40,9 @@ bool Std2DMaterial::CreateVertexShader(ShaderCreateInfoVertex *vsc) MaterialCreateInfo *Std2DMaterial::Create() { + if(!BeforeCreateShader()) + return(nullptr); + if(mci->hasVertex()) if(!CreateVertexShader(mci->GetVS())) return(nullptr); @@ -52,6 +55,9 @@ MaterialCreateInfo *Std2DMaterial::Create() if(!CreateFragmentShader(mci->GetFS())) return(nullptr); + if(!AfterCreateShader()) + return(false); + if(!mci->CreateShader()) return(nullptr); diff --git a/src/ShaderGen/2d/Std2DMaterial.h b/src/ShaderGen/2d/Std2DMaterial.h index 4a5244e0..8246e962 100644 --- a/src/ShaderGen/2d/Std2DMaterial.h +++ b/src/ShaderGen/2d/Std2DMaterial.h @@ -25,10 +25,14 @@ namespace hgl protected: + virtual bool BeforeCreateShader(){return true;/*some work before creating shader*/}; + virtual bool CreateVertexShader(ShaderCreateInfoVertex *); virtual bool CreateGeometryShader(ShaderCreateInfoGeometry *){return false;} virtual bool CreateFragmentShader(ShaderCreateInfoFragment *)=0; + virtual bool AfterCreateShader(){return true;/*some work after creating shader*/}; + public: Std2DMaterial(const Material2DConfig *); diff --git a/src/ShaderGen/GLSLCompiler.cpp b/src/ShaderGen/GLSLCompiler.cpp index 8ff9d842..e03e3e42 100644 --- a/src/ShaderGen/GLSLCompiler.cpp +++ b/src/ShaderGen/GLSLCompiler.cpp @@ -4,6 +4,7 @@ #include #include #include +#include namespace hgl { @@ -171,6 +172,8 @@ namespace hgl if(!result) { + LOG_ERROR(U8_TEXT("Compile shader failed, error info: ")+UTF8String(spv->log)); + FreeSPVData(spv); return(nullptr); } diff --git a/src/ShaderGen/MaterialCreateInfo.cpp b/src/ShaderGen/MaterialCreateInfo.cpp index 80c2af46..95f7c864 100644 --- a/src/ShaderGen/MaterialCreateInfo.cpp +++ b/src/ShaderGen/MaterialCreateInfo.cpp @@ -148,6 +148,7 @@ bool MaterialCreateInfo::SetMaterialInstance(const AnsiString &mi_glsl_codes,con hgl::strcpy(ubo->name,DESCRIPTOR_NAME_MAX_LENGTH,SBS_MaterialInstanceData.name); ubo->stage_flag=shader_stage; + mdi.AddStruct(SBS_MaterialInstanceData.struct_name,SBS_MaterialInstanceData.codes); mdi.AddUBO(shader_stage,DescriptorSetType::PerMaterial,ubo); auto *it=shader_map.GetDataList(); @@ -155,7 +156,9 @@ bool MaterialCreateInfo::SetMaterialInstance(const AnsiString &mi_glsl_codes,con for(int i=0;ikey&shader_stage) - (*it)->value->SetMaterialInstance(ubo); + (*it)->value->SetMaterialInstance(ubo,mi_codes); + + ++it; } vert->AddMaterialInstanceID(); //增加一个材质实例ID diff --git a/src/ShaderGen/ShaderCreateInfo.cpp b/src/ShaderGen/ShaderCreateInfo.cpp index cd3cb878..f1779c80 100644 --- a/src/ShaderGen/ShaderCreateInfo.cpp +++ b/src/ShaderGen/ShaderCreateInfo.cpp @@ -76,11 +76,13 @@ bool ShaderCreateInfo::ProcSubpassInput() return(true); } -void ShaderCreateInfo::SetMaterialInstance(UBODescriptor *ubo) +void ShaderCreateInfo::SetMaterialInstance(UBODescriptor *ubo,const AnsiString &mi) { sdm->AddUBO(DescriptorSetType::PerMaterial,ubo); sdm->AddStruct(mtl::MaterialInstanceStruct); AddFunction(mtl::func::GetMI); + + mi_codes=mi; } bool ShaderCreateInfo::ProcInput(ShaderCreateInfo *last_sc) @@ -120,7 +122,7 @@ bool ShaderCreateInfo::ProcOutput() for(uint i=0;iinterpolation!=Interpolation::Smooth) { @@ -167,6 +169,17 @@ bool ShaderCreateInfo::ProcStruct() 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() { auto ubo_list=sdm->GetUBOList(); @@ -187,7 +200,7 @@ bool ShaderCreateInfo::ProcUBO() final_shader+=AnsiString::numberOf((*ubo)->binding); final_shader+=") uniform "; final_shader+=(*ubo)->type; - final_shader+="{\n"; + final_shader+="\n{"; if(!mdi->GetStruct((*ubo)->type,struct_codes)) return(false); @@ -282,6 +295,8 @@ bool ShaderCreateInfo::CreateShader(ShaderCreateInfo *last_sc) // if(!ProcStruct()) // return(false); + ProcMI(); + if(!ProcUBO()) return(false); //if(!ProcSSBO())