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",
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=

View File

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

View File

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

View File

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

View File

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

View File

@ -4,6 +4,7 @@
#include<hgl/filesystem/FileSystem.h>
#include<vulkan/vulkan.h>
#include<hgl/graph/VKPhysicalDevice.h>
#include<hgl/log/Logger.h>
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);
}

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);
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;i<shader_map.GetCount();i++)
{
if((*it)->key&shader_stage)
(*it)->value->SetMaterialInstance(ubo);
(*it)->value->SetMaterialInstance(ubo,mi_codes);
++it;
}
vert->AddMaterialInstanceID(); //增加一个材质实例ID

View File

@ -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;i<ssd.count;i++)
{
output_struct+="\t";
output_struct+=" ";
if(ss->interpolation!=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())