diff --git a/ShaderLibrary/GetJointMatrix.glsl b/ShaderLibrary/GetJointMatrix.glsl new file mode 100644 index 00000000..fb5a6f93 --- /dev/null +++ b/ShaderLibrary/GetJointMatrix.glsl @@ -0,0 +1,11 @@ +mat4 GetJointMatrix() +{ +// Joint数据分Joint ID和Joint Weight两部分 +// Joint ID是一个uvec4,在shader中为整数。在C++端可使用RGBA8UI或是RGBA16UI来传递。 +// Joint Weight是权重,在shader中为浮点。在C++端使用RGBA8或RGBA4来传递。 + + return joint.mats[JointID.x]*JointWeight.x+ + joint.mats[JointID.y]*JointWeight.y+ + joint.mats[JointID.z]*JointWeight.z+ + joint.mats[JointID.w]*JointWeight.w; +} diff --git a/ShaderLibrary/GetLocalToWorld.glsl b/ShaderLibrary/GetLocalToWorld.glsl new file mode 100644 index 00000000..6566dec7 --- /dev/null +++ b/ShaderLibrary/GetLocalToWorld.glsl @@ -0,0 +1,4 @@ +mat4 GetLocalToWorld() +{ + return l2w.mats[Assign.x]; +} diff --git a/ShaderLibrary/GetMI.glsl b/ShaderLibrary/GetMI.glsl new file mode 100644 index 00000000..faf52b4d --- /dev/null +++ b/ShaderLibrary/GetMI.glsl @@ -0,0 +1,8 @@ +MaterialInstance GetMI() +{ +#if ShaderStage == VertexShader + return mtl.mi[Assign.y]; +#else + return mtl.mi[Input.MaterialInstanceID]; +#endif +} diff --git a/ShaderLibrary/HandoverMI.glsl b/ShaderLibrary/HandoverMI.glsl new file mode 100644 index 00000000..b719370a --- /dev/null +++ b/ShaderLibrary/HandoverMI.glsl @@ -0,0 +1,10 @@ +void HandoverMI() +{ +#if ShaderStage == VertexShader + Output.MaterialInstanceID=Assign.y; +#elif ShaderStage == GeometryShader + Output.MaterialInstanceID=Input[0].MaterialInstanceID; +#else + Output.MaterialInstanceID=Input.MaterialInstanceID; +#endif +} diff --git a/ShaderLibrary/ShaderHeader.glsl b/ShaderLibrary/ShaderHeader.glsl new file mode 100644 index 00000000..8810a476 --- /dev/null +++ b/ShaderLibrary/ShaderHeader.glsl @@ -0,0 +1,10 @@ +#version 460 core + +#define VertexShader 0x01 +#define TessControlShader 0x02 +#define TeseEvalShader 0x04 +#define GeometryShader 0x08 +#define FragmentShader 0x10 +#define ComputeShader 0x20 +#define TaskShader 0x40 +#define MeshShader 0x80 diff --git a/inc/hgl/shadergen/ShaderCreateInfo.h b/inc/hgl/shadergen/ShaderCreateInfo.h index 11c2ea9f..0333f1a7 100644 --- a/inc/hgl/shadergen/ShaderCreateInfo.h +++ b/inc/hgl/shadergen/ShaderCreateInfo.h @@ -80,6 +80,7 @@ public: int AddOutput(const AnsiString &type,const AnsiString &name,Interpolation inter=Interpolation::Smooth); void AddFunction(const AnsiString &str){function_list.Add(str);} + void AddFunction(const AnsiString *str){function_list.Add(*str);} void SetMaterialInstance(UBODescriptor *,const AnsiString &); void SetLocalToWorld(UBODescriptor *); diff --git a/inc/hgl/shadergen/ShaderCreateInfoVertex.h b/inc/hgl/shadergen/ShaderCreateInfoVertex.h index ad570d66..978188dc 100644 --- a/inc/hgl/shadergen/ShaderCreateInfoVertex.h +++ b/inc/hgl/shadergen/ShaderCreateInfoVertex.h @@ -13,7 +13,7 @@ namespace hgl public: - ShaderCreateInfoVertex(MaterialDescriptorInfo *m):ShaderCreateInfo(VK_SHADER_STAGE_VERTEX_BIT,m){} + ShaderCreateInfoVertex(MaterialDescriptorInfo *); ~ShaderCreateInfoVertex()=default; int AddInput(const graph::VAT &type,const AnsiString &name,const VkVertexInputRate input_rate=VK_VERTEX_INPUT_RATE_VERTEX,const VertexInputGroup &group=VertexInputGroup::Basic); diff --git a/src/ShaderGen/MaterialCreateInfo.cpp b/src/ShaderGen/MaterialCreateInfo.cpp index 1429ff0d..c4daba9b 100644 --- a/src/ShaderGen/MaterialCreateInfo.cpp +++ b/src/ShaderGen/MaterialCreateInfo.cpp @@ -3,11 +3,18 @@ #include #include #include"common/MFCommon.h" +#include"ShaderLibrary.h" using namespace hgl; using namespace hgl::graph; STD_MTL_NAMESPACE_BEGIN + +namespace +{ + const AnsiString *MF_HandoverMI=nullptr; +}//namespace + MaterialCreateInfo::MaterialCreateInfo(const MaterialCreateConfig *mc) { config=mc; @@ -32,6 +39,9 @@ MaterialCreateInfo::MaterialCreateInfo(const MaterialCreateConfig *mc) l2w_shader_stage=0; l2w_ubo=nullptr; } + + if(!MF_HandoverMI) + MF_HandoverMI=LoadShader("HandoverMI"); } bool MaterialCreateInfo::AddStruct(const AnsiString &struct_name,const AnsiString &codes) @@ -248,7 +258,7 @@ bool MaterialCreateInfo::CreateShader() { sc->AddOutput(VAT_UINT,mtl::func::MaterialInstanceID,Interpolation::Flat); - sc->AddFunction(mtl::func::HandoverMI); + sc->AddFunction(MF_HandoverMI); } sc->CreateShader(last); diff --git a/src/ShaderGen/ShaderCreateInfo.cpp b/src/ShaderGen/ShaderCreateInfo.cpp index 057f5bd8..61c813fa 100644 --- a/src/ShaderGen/ShaderCreateInfo.cpp +++ b/src/ShaderGen/ShaderCreateInfo.cpp @@ -5,9 +5,16 @@ #include"GLSLCompiler.h" #include"common/MFCommon.h" +#include"ShaderLibrary.h" namespace hgl{namespace graph{ +namespace +{ + const AnsiString *ShaderFileHeader=nullptr; + const AnsiString *MF_GetMI=nullptr; +}//namespace + ShaderCreateInfo::ShaderCreateInfo(VkShaderStageFlagBits ss,MaterialDescriptorInfo *m) { shader_stage=ss; @@ -18,6 +25,9 @@ ShaderCreateInfo::ShaderCreateInfo(VkShaderStageFlagBits ss,MaterialDescriptorIn define_macro_max_length=0; define_value_max_length=0; + + if(!ShaderFileHeader)ShaderFileHeader =mtl::LoadShader("ShaderHeader"); + if(!MF_GetMI )MF_GetMI =mtl::LoadShader("GetMI"); } ShaderCreateInfo::~ShaderCreateInfo() @@ -159,7 +169,7 @@ void ShaderCreateInfo::SetMaterialInstance(UBODescriptor *ubo,const AnsiString & sdm->AddUBO(DescriptorSetType::PerMaterial,ubo); sdm->AddStruct(mtl::MaterialInstanceStruct); - AddFunction(mtl::func::GetMI); + AddFunction(MF_GetMI); mi_codes=mi; } @@ -372,27 +382,18 @@ bool ShaderCreateInfo::ProcSampler() bool ShaderCreateInfo::CreateShader(ShaderCreateInfo *last_sc) { + if(!ShaderFileHeader) + return(false); + if(main_function.IsEmpty()) return(false); - //@see VKShaderStage.cpp - - final_shader=R"(#version 460 core - -#define VertexShader 0x01 -#define TessControlShader 0x02 -#define TeseEvalShader 0x04 -#define GeometryShader 0x08 -#define FragmentShader 0x10 -#define ComputeShader 0x20 -#define TaskShader 0x40 -#define MeshShader 0x80 - -#define ShaderStage 0x)"; + final_shader=ShaderFileHeader->c_str(); { char ss_hex_str[9]; + final_shader+="\n#define ShaderStage 0x"; final_shader+=utos(ss_hex_str,8,uint(shader_stage),16); final_shader+="\n"; } diff --git a/src/ShaderGen/ShaderCreateInfoVertex.cpp b/src/ShaderGen/ShaderCreateInfoVertex.cpp index 8874a35e..235a0331 100644 --- a/src/ShaderGen/ShaderCreateInfoVertex.cpp +++ b/src/ShaderGen/ShaderCreateInfoVertex.cpp @@ -5,8 +5,19 @@ #include #include"GLSLCompiler.h" #include"common/MFCommon.h" +#include"ShaderLibrary.h" VK_NAMESPACE_BEGIN +namespace +{ + const AnsiString *MF_GetLocalToWorld=nullptr; +}//namespace + +ShaderCreateInfoVertex::ShaderCreateInfoVertex(MaterialDescriptorInfo *m):ShaderCreateInfo(VK_SHADER_STAGE_VERTEX_BIT,m) +{ + if(!MF_GetLocalToWorld)MF_GetLocalToWorld=mtl::LoadShader("GetLocalToWorld"); +} + int ShaderCreateInfoVertex::AddInput(const VAT &type,const AnsiString &name,const VkVertexInputRate input_rate,const VertexInputGroup &group) { ShaderAttribute *ss=new ShaderAttribute; @@ -45,7 +56,7 @@ void ShaderCreateInfoVertex::AddAssign() VK_VERTEX_INPUT_RATE_INSTANCE, VertexInputGroup::Assign); - AddFunction(mtl::func::GetLocalToWorld); + AddFunction(MF_GetLocalToWorld); } bool ShaderCreateInfoVertex::ProcInput(ShaderCreateInfo *) diff --git a/src/ShaderGen/ShaderLibrary.cpp b/src/ShaderGen/ShaderLibrary.cpp new file mode 100644 index 00000000..6a61d42f --- /dev/null +++ b/src/ShaderGen/ShaderLibrary.cpp @@ -0,0 +1,49 @@ +#include +#include +#include +#include +#include +#include + +STD_MTL_NAMESPACE_BEGIN + +namespace +{ + ObjectMap shader_library; +} + +// ΪDebug׶ΣֱӴļϵͳ + +const AnsiString *LoadShader(const AnsiString &shader_name) +{ + if(shader_name.IsEmpty()) + return(nullptr); + + UTF8String *shader; + + if(shader_library.Get(shader_name,shader)) + return shader; + + const AnsiString filename=shader_name+".glsl"; + + const AnsiString fullname=filesystem::MergeFilename("ShaderLibrary",filename); + + const OSString os_fn=ToOSString(fullname); + + if(!filesystem::FileExist(os_fn)) + return(nullptr); + + shader=new UTF8String; + + if(LoadStringFromTextFile(*shader,os_fn)<=0) + { + delete shader; + shader=nullptr; + } + + shader_library.Add(shader_name,shader); + + return shader; +} + +STD_MTL_NAMESPACE_END diff --git a/src/ShaderGen/ShaderLibrary.h b/src/ShaderGen/ShaderLibrary.h new file mode 100644 index 00000000..3b505ca8 --- /dev/null +++ b/src/ShaderGen/ShaderLibrary.h @@ -0,0 +1,12 @@ +#pragma once + +#include +#include + +STD_MTL_NAMESPACE_BEGIN + +//void SetGlobalDefine(const AnsiString &,const AnsiString &); + +const AnsiString *LoadShader(const AnsiString &); + +STD_MTL_NAMESPACE_END diff --git a/src/ShaderGen/common/MFCommon.h b/src/ShaderGen/common/MFCommon.h index 8d0e5f39..0d64369b 100644 --- a/src/ShaderGen/common/MFCommon.h +++ b/src/ShaderGen/common/MFCommon.h @@ -7,51 +7,7 @@ namespace func { //C++端使用一个RG8UI或RGB16UI格式的顶点输入流来传递Assign数据,其中x为LocalToWorld ID,y为MaterialInstance ID - constexpr const char GetLocalToWorld[]=R"( -mat4 GetLocalToWorld() -{ - return l2w.mats[Assign.x]; -} -)"; - constexpr const char MaterialInstanceID[]="MaterialInstanceID"; -constexpr const char HandoverMI[]=R"( -void HandoverMI() -{ -#if ShaderStage == VertexShader - Output.MaterialInstanceID=Assign.y; -#elif ShaderStage == GeometryShader - Output.MaterialInstanceID=Input[0].MaterialInstanceID; -#else - Output.MaterialInstanceID=Input.MaterialInstanceID; -#endif -} -)"; - - constexpr const char GetMI[]=R"( -MaterialInstance GetMI() -{ -#if ShaderStage == VertexShader - return mtl.mi[Assign.y]; -#else - return mtl.mi[Input.MaterialInstanceID]; -#endif -} -)"; - -// Joint数据分Joint ID和Joint Weight两部分 -// Joint ID是一个uvec4,在shader中为整数。在C++端可使用RGBA8UI或是RGBA16UI来传递。 -// Joint Weight是权重,在shader中为浮点。在C++端使用RGBA8或RGBA4来传递。 - - constexpr const char GetJointMatrix[]=R"( -mat4 GetJointMatrix() -{ - return joint.mats[JointID.x]*JointWeight.x+ - joint.mats[JointID.y]*JointWeight.y+ - joint.mats[JointID.z]*JointWeight.z+ - joint.mats[JointID.w]*JointWeight.w; -} -)"; }//namespace func STD_MTL_NAMESPACE_END