From 8a5711154fe0d4d180ff8eff1848fb03988a10a0 Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Tue, 10 Oct 2023 14:49:33 +0800 Subject: [PATCH] finished StdMaterialLoader, test all examples ok. --- CMCore | 2 +- CMSceneGraph | 2 +- ShaderLibrary/Std2D/PureTexture2D.mtl | 2 +- ShaderLibrary/Std2D/RectTexture2D.mtl | 2 +- ShaderLibrary/Std2D/RectTexture2DArray.mtl | 2 +- example/Gizmo/PlaneGrid3D.cpp | 3 +- example/Gizmo/RayPicking.cpp | 3 +- example/Texture/texture_quad.cpp | 3 +- example/Texture/texture_rect_array.cpp | 3 +- inc/hgl/graph/mtl/Material2DCreateConfig.h | 2 +- inc/hgl/graph/mtl/Material3DCreateConfig.h | 8 ++ src/ShaderGen/2d/Std2DMaterialLoader.cpp | 68 ++++++-------- src/ShaderGen/3d/Std3DMaterialLoader.cpp | 104 +++++++++++++++++++++ 13 files changed, 155 insertions(+), 49 deletions(-) diff --git a/CMCore b/CMCore index 15b86eaf..460dc1c5 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit 15b86eaf3bf661cff9f21d9b53a334a7b5e358e4 +Subproject commit 460dc1c5ecfba0f0cef93026be5d25a4f86605b1 diff --git a/CMSceneGraph b/CMSceneGraph index b5b5b0b2..88f06404 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit b5b5b0b2e7b00ec3d399659573ba40db8ec8e175 +Subproject commit 88f064043f1402ced42c91ecb34f26a2b229a134 diff --git a/ShaderLibrary/Std2D/PureTexture2D.mtl b/ShaderLibrary/Std2D/PureTexture2D.mtl index 974bc8f0..5e1b5bf3 100644 --- a/ShaderLibrary/Std2D/PureTexture2D.mtl +++ b/ShaderLibrary/Std2D/PureTexture2D.mtl @@ -23,7 +23,7 @@ Code #Fragment -Sampler2D TextureColor +sampler2D TextureColor Output { diff --git a/ShaderLibrary/Std2D/RectTexture2D.mtl b/ShaderLibrary/Std2D/RectTexture2D.mtl index cf9cbb72..5726913d 100644 --- a/ShaderLibrary/Std2D/RectTexture2D.mtl +++ b/ShaderLibrary/Std2D/RectTexture2D.mtl @@ -52,7 +52,7 @@ Code #Fragment -Sampler2D TextureColor +sampler2D TextureColor Output { diff --git a/ShaderLibrary/Std2D/RectTexture2DArray.mtl b/ShaderLibrary/Std2D/RectTexture2DArray.mtl index 42538e17..19d247db 100644 --- a/ShaderLibrary/Std2D/RectTexture2DArray.mtl +++ b/ShaderLibrary/Std2D/RectTexture2DArray.mtl @@ -61,7 +61,7 @@ Code #Fragment -Sampler2DArray TextureColor +sampler2DArray TextureColor Output { diff --git a/example/Gizmo/PlaneGrid3D.cpp b/example/Gizmo/PlaneGrid3D.cpp index e03bb136..0e4ddfc2 100644 --- a/example/Gizmo/PlaneGrid3D.cpp +++ b/example/Gizmo/PlaneGrid3D.cpp @@ -36,7 +36,8 @@ private: cfg.local_to_world=true; - AutoDelete mci=mtl::CreateVertexLuminance3D(&cfg); + //AutoDelete mci=mtl::CreateVertexLuminance3D(&cfg); + AutoDelete mci=mtl::LoadMaterialFromFile("Std3D/VertexLum3D",&cfg); material=db->CreateMaterial(mci); if(!material)return(false); diff --git a/example/Gizmo/RayPicking.cpp b/example/Gizmo/RayPicking.cpp index db5a3231..84de4b6c 100644 --- a/example/Gizmo/RayPicking.cpp +++ b/example/Gizmo/RayPicking.cpp @@ -60,7 +60,8 @@ private: cfg.local_to_world=true; - AutoDelete mci=mtl::CreateVertexLuminance3D(&cfg); + //AutoDelete mci=mtl::CreateVertexLuminance3D(&cfg); + AutoDelete mci=mtl::LoadMaterialFromFile("Std3D/VertexLum3D",&cfg); material=db->CreateMaterial(mci); if(!material)return(false); diff --git a/example/Texture/texture_quad.cpp b/example/Texture/texture_quad.cpp index da7cb613..53b197d1 100644 --- a/example/Texture/texture_quad.cpp +++ b/example/Texture/texture_quad.cpp @@ -56,7 +56,8 @@ private: cfg.coordinate_system=CoordinateSystem2D::NDC; cfg.local_to_world=false; - AutoDelete mci=mtl::CreatePureTexture2D(&cfg); + //AutoDelete mci=mtl::CreatePureTexture2D(&cfg); + AutoDelete mci=mtl::LoadMaterialFromFile("Std2D/PureTexture2D",&cfg); material=db->CreateMaterial(mci); diff --git a/example/Texture/texture_rect_array.cpp b/example/Texture/texture_rect_array.cpp index 3e1e21a5..3a5be075 100644 --- a/example/Texture/texture_rect_array.cpp +++ b/example/Texture/texture_rect_array.cpp @@ -94,7 +94,8 @@ private: cfg.coordinate_system=CoordinateSystem2D::ZeroToOne; cfg.local_to_world=true; - AutoDelete mci=mtl::CreateRectTexture2DArray(&cfg); + //AutoDelete mci=mtl::CreateRectTexture2DArray(&cfg); + AutoDelete mci=mtl::LoadMaterialFromFile("Std2D/RectTexture2DArray",&cfg); material=db->CreateMaterial(mci); diff --git a/inc/hgl/graph/mtl/Material2DCreateConfig.h b/inc/hgl/graph/mtl/Material2DCreateConfig.h index eaca538c..9013fd76 100644 --- a/inc/hgl/graph/mtl/Material2DCreateConfig.h +++ b/inc/hgl/graph/mtl/Material2DCreateConfig.h @@ -50,6 +50,6 @@ MaterialCreateInfo *CreateRectTexture2DArray(Material2DCreateConfig *); * @param cfg 材质创建参数 * @return 材质创建信息 */ -MaterialCreateInfo *LoadMaterialFromFile(const AnsiString &mtl_name,const Material2DCreateConfig *cfg); ///<从文件加载材质 +MaterialCreateInfo *LoadMaterialFromFile(const AnsiString &mtl_name,Material2DCreateConfig *cfg); ///<从文件加载材质 STD_MTL_NAMESPACE_END #endif//HGL_GRAPH_MTL_2D_CREATE_CONFIG_INCLUDE diff --git a/inc/hgl/graph/mtl/Material3DCreateConfig.h b/inc/hgl/graph/mtl/Material3DCreateConfig.h index f44f7ff1..161ac86a 100644 --- a/inc/hgl/graph/mtl/Material3DCreateConfig.h +++ b/inc/hgl/graph/mtl/Material3DCreateConfig.h @@ -38,4 +38,12 @@ MaterialCreateInfo *CreateVertexLuminance3D(const Material3DCreateConfig *); //MaterialCreateInfo *CreatePureTexture2D(const Material2DCreateConfig *); //MaterialCreateInfo *CreateRectTexture2D(Material2DCreateConfig *); //MaterialCreateInfo *CreateRectTexture2DArray(Material2DCreateConfig *); + +/** + * 从文件加载材质 + * @param mtl_name 材质名称 + * @param cfg 材质创建参数 + * @return 材质创建信息 + */ +MaterialCreateInfo *LoadMaterialFromFile(const AnsiString &name,Material3DCreateConfig *cfg); STD_MTL_NAMESPACE_END diff --git a/src/ShaderGen/2d/Std2DMaterialLoader.cpp b/src/ShaderGen/2d/Std2DMaterialLoader.cpp index 35d3065a..b767f6eb 100644 --- a/src/ShaderGen/2d/Std2DMaterialLoader.cpp +++ b/src/ShaderGen/2d/Std2DMaterialLoader.cpp @@ -39,78 +39,68 @@ namespace return true; } + material_file::ShaderData *CommonProc(VkShaderStageFlagBits ss,ShaderCreateInfo *sc) + { + material_file::ShaderData *sd=mfd->shader[ss]; + + if(!sd) + return(nullptr); + + for(auto &ua:sd->output) + sc->AddOutput(ua.vat,ua.name); + + for(auto &s:sd->sampler) + mci->AddSampler(ss,DescriptorSetType::PerMaterial,s.type,s.name); + + sc->SetMain(sd->code,sd->code_length); //这里会产生复制这个string,但我不希望产生这个。未来想办法改进 + + return sd; + } + bool CustomVertexShader(ShaderCreateInfoVertex *vsc) override { if(!Std2DMaterial::CustomVertexShader(vsc)) return(false); - if(mfd->vi.GetCount()>0) - { - for(auto &ua:mfd->vi) - vsc->AddInput(ua.vat,ua.name); - } + for(auto &ua:mfd->vi) + vsc->AddInput(ua.vat,ua.name); - material_file::ShaderData *sd=mfd->shader[VK_SHADER_STAGE_VERTEX_BIT]; - - if(!sd) - return(false); - - for(auto &ua:sd->output) - vsc->AddOutput(ua.vat,ua.name); - - vsc->SetMain(sd->code,sd->code_length); //这里会产生复制这个string,但我不希望产生这个。未来想办法改进 - - return true; + return CommonProc(VK_SHADER_STAGE_VERTEX_BIT,vsc); } bool CustomGeometryShader(ShaderCreateInfoGeometry *gsc) override { - if(!Std2DMaterial::CustomGeometryShader(gsc)) - return(false); - - material_file::GeometryShaderData *sd=(material_file::GeometryShaderData *)(mfd->shader[VK_SHADER_STAGE_GEOMETRY_BIT]); + material_file::GeometryShaderData *sd=(material_file::GeometryShaderData *)CommonProc(VK_SHADER_STAGE_GEOMETRY_BIT,gsc); if(!sd) return(false); gsc->SetGeom(sd->input_prim,sd->output_prim,sd->max_vertices); - for(auto &ua:sd->output) - gsc->AddOutput(ua.vat,ua.name); - - gsc->SetMain(sd->code,sd->code_length); //这里会产生复制这个string,但我不希望产生这个。未来想办法改进 - return true; } bool CustomFragmentShader(ShaderCreateInfoFragment *fsc) override { - material_file::ShaderData *sd=mfd->shader[VK_SHADER_STAGE_FRAGMENT_BIT]; - - if(!sd) - return(false); - - for(auto &ua:sd->output) - fsc->AddOutput(ua.vat,ua.name); - - fsc->SetMain(sd->code,sd->code_length); //这里会产生复制这个string,但我不希望产生这个。未来想办法改进 - - return true; + return CommonProc(VK_SHADER_STAGE_FRAGMENT_BIT,fsc); } - - bool EndCustomShader() override{return true;} };//class Std2DMaterialLoader:public Std2DMaterial }//namespace material_file::MaterialFileData *LoadMaterialDataFromFile(const AnsiString &mtl_filename); -MaterialCreateInfo *LoadMaterialFromFile(const AnsiString &name,const Material2DCreateConfig *cfg) +MaterialCreateInfo *LoadMaterialFromFile(const AnsiString &name,Material2DCreateConfig *cfg) { + if(name.IsEmpty()||!cfg) + return(nullptr); + material_file::MaterialFileData *mfd=LoadMaterialDataFromFile(name); if(!mfd) return nullptr; + cfg->shader_stage_flag_bit=mfd->shader_stage_flag_bit; + Std2DMaterialLoader mtl(mfd,cfg); return mtl.Create(); diff --git a/src/ShaderGen/3d/Std3DMaterialLoader.cpp b/src/ShaderGen/3d/Std3DMaterialLoader.cpp index e69de29b..9cc4b04d 100644 --- a/src/ShaderGen/3d/Std3DMaterialLoader.cpp +++ b/src/ShaderGen/3d/Std3DMaterialLoader.cpp @@ -0,0 +1,104 @@ +#include "MaterialFileData.h" +#include "Std3DMaterial.h" +#include + +STD_MTL_NAMESPACE_BEGIN + +namespace { +class Std3DMaterialLoader : public Std3DMaterial { +protected: + material_file::MaterialFileData* mfd; + +public: + Std3DMaterialLoader(material_file::MaterialFileData* data, const Material3DCreateConfig* cfg) + : Std3DMaterial(cfg) + { + mfd = data; + } + + ~Std3DMaterialLoader() + { + delete mfd; + } + + bool BeginCustomShader() override + { + if (!Std3DMaterial::BeginCustomShader()) + return (false); + + if (mfd->mi.mi_bytes > 0) { + mci->SetMaterialInstance(mfd->mi.code, + mfd->mi.mi_bytes, + mfd->mi.shader_stage_flag_bits); + } + + return true; + } + + material_file::ShaderData* CommonProc(VkShaderStageFlagBits ss, ShaderCreateInfo* sc) + { + material_file::ShaderData* sd = mfd->shader[ss]; + + if (!sd) + return (nullptr); + + for (auto& ua : sd->output) + sc->AddOutput(ua.vat, ua.name); + + for (auto& s : sd->sampler) + mci->AddSampler(ss, DescriptorSetType::PerMaterial, s.type, s.name); + + sc->SetMain(sd->code, sd->code_length); // 这里会产生复制这个string,但我不希望产生这个。未来想办法改进 + + return sd; + } + + bool CustomVertexShader(ShaderCreateInfoVertex* vsc) override + { + if (!Std3DMaterial::CustomVertexShader(vsc)) + return (false); + + for (auto& ua : mfd->vi) + vsc->AddInput(ua.vat, ua.name); + + return CommonProc(VK_SHADER_STAGE_VERTEX_BIT, vsc); + } + + bool CustomGeometryShader(ShaderCreateInfoGeometry* gsc) override + { + material_file::GeometryShaderData* sd = (material_file::GeometryShaderData*)CommonProc(VK_SHADER_STAGE_GEOMETRY_BIT, gsc); + + if (!sd) + return (false); + + gsc->SetGeom(sd->input_prim, sd->output_prim, sd->max_vertices); + + return true; + } + + bool CustomFragmentShader(ShaderCreateInfoFragment* fsc) override + { + return CommonProc(VK_SHADER_STAGE_FRAGMENT_BIT, fsc); + } +}; // class Std3DMaterialLoader:public Std3DMaterial +} // namespace + +material_file::MaterialFileData* LoadMaterialDataFromFile(const AnsiString& mtl_filename); + +MaterialCreateInfo* LoadMaterialFromFile(const AnsiString& name, Material3DCreateConfig* cfg) +{ + if (name.IsEmpty() || !cfg) + return (nullptr); + + material_file::MaterialFileData* mfd = LoadMaterialDataFromFile(name); + + if (!mfd) + return nullptr; + + cfg->shader_stage_flag_bit = mfd->shader_stage_flag_bit; + + Std3DMaterialLoader mtl(mfd, cfg); + + return mtl.Create(); +} +STD_MTL_NAMESPACE_END