moved glsl to standalone .glsl file.

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-10-07 17:02:00 +08:00
parent 19df201ab5
commit 86123827cb
13 changed files with 145 additions and 62 deletions

View File

@ -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;
}

View File

@ -0,0 +1,4 @@
mat4 GetLocalToWorld()
{
return l2w.mats[Assign.x];
}

8
ShaderLibrary/GetMI.glsl Normal file
View File

@ -0,0 +1,8 @@
MaterialInstance GetMI()
{
#if ShaderStage == VertexShader
return mtl.mi[Assign.y];
#else
return mtl.mi[Input.MaterialInstanceID];
#endif
}

View File

@ -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
}

View File

@ -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

View File

@ -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 *);

View File

@ -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);

View File

@ -3,11 +3,18 @@
#include<hgl/graph/mtl/UBOCommon.h>
#include<hgl/graph/VKDeviceAttribute.h>
#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);

View File

@ -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";
}

View File

@ -5,8 +5,19 @@
#include<hgl/graph/VKRenderAssign.h>
#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 *)

View File

@ -0,0 +1,49 @@
#include<hgl/type/String.h>
#include<hgl/type/Map.h>
#include<hgl/graph/mtl/StdMaterial.h>
#include<hgl/io/LoadString.h>
#include<hgl/filesystem/Filename.h>
#include<hgl/filesystem/Filesystem.h>
STD_MTL_NAMESPACE_BEGIN
namespace
{
ObjectMap<AnsiString,UTF8String> 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

View File

@ -0,0 +1,12 @@
#pragma once
#include<hgl/type/String.h>
#include<hgl/graph/mtl/StdMaterial.h>
STD_MTL_NAMESPACE_BEGIN
//void SetGlobalDefine(const AnsiString &,const AnsiString &);
const AnsiString *LoadShader(const AnsiString &);
STD_MTL_NAMESPACE_END

View File

@ -7,51 +7,7 @@ namespace func
{
//C++端使用一个RG8UI或RGB16UI格式的顶点输入流来传递Assign数据其中x为LocalToWorld IDy为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