completed MaterialInstance codes in ShaderGen
This commit is contained in:
parent
1668a0c973
commit
a04742c347
@ -10,11 +10,11 @@ constexpr const ShaderBufferSource SBS_ViewportInfo=
|
|||||||
"viewport",
|
"viewport",
|
||||||
|
|
||||||
R"(
|
R"(
|
||||||
mat4 ortho_matrix;
|
mat4 ortho_matrix;
|
||||||
|
|
||||||
vec2 canvas_resolution;
|
vec2 canvas_resolution;
|
||||||
vec2 viewport_resolution;
|
vec2 viewport_resolution;
|
||||||
vec2 inv_viewport_resolution;
|
vec2 inv_viewport_resolution;
|
||||||
)"
|
)"
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -24,22 +24,22 @@ constexpr const ShaderBufferSource SBS_CameraInfo=
|
|||||||
"camera",
|
"camera",
|
||||||
|
|
||||||
R"(
|
R"(
|
||||||
mat4 projection;
|
mat4 projection;
|
||||||
mat4 inverse_projection;
|
mat4 inverse_projection;
|
||||||
|
|
||||||
mat4 view;
|
mat4 view;
|
||||||
mat4 inverse_view;
|
mat4 inverse_view;
|
||||||
|
|
||||||
mat4 vp;
|
mat4 vp;
|
||||||
mat4 inverse_vp;
|
mat4 inverse_vp;
|
||||||
|
|
||||||
mat4 sky;
|
mat4 sky;
|
||||||
|
|
||||||
vec3 pos; //eye
|
vec3 pos; //eye
|
||||||
vec3 view_line; //pos-target
|
vec3 view_line; //pos-target
|
||||||
vec3 world_up;
|
vec3 world_up;
|
||||||
|
|
||||||
float znear,zfar;)"
|
float znear,zfar;)"
|
||||||
};
|
};
|
||||||
|
|
||||||
constexpr const char MaterialInstanceStruct[]="MaterialInstance";
|
constexpr const char MaterialInstanceStruct[]="MaterialInstance";
|
||||||
@ -49,7 +49,8 @@ constexpr const ShaderBufferSource SBS_MaterialInstanceData=
|
|||||||
"MaterialInstanceData",
|
"MaterialInstanceData",
|
||||||
"mtl",
|
"mtl",
|
||||||
|
|
||||||
"MaterialInstance mi[256];"
|
R"(
|
||||||
|
MaterialInstance mi[256];)"
|
||||||
};
|
};
|
||||||
|
|
||||||
constexpr const ShaderBufferSource SBS_JointInfo=
|
constexpr const ShaderBufferSource SBS_JointInfo=
|
||||||
|
@ -27,6 +27,8 @@ protected:
|
|||||||
|
|
||||||
AnsiString output_struct;
|
AnsiString output_struct;
|
||||||
|
|
||||||
|
AnsiString mi_codes;
|
||||||
|
|
||||||
AnsiStringList function_list;
|
AnsiStringList function_list;
|
||||||
AnsiString main_function;
|
AnsiString main_function;
|
||||||
|
|
||||||
@ -43,6 +45,8 @@ protected:
|
|||||||
|
|
||||||
virtual bool ProcStruct();
|
virtual bool ProcStruct();
|
||||||
|
|
||||||
|
virtual bool ProcMI();
|
||||||
|
|
||||||
virtual bool ProcUBO();
|
virtual bool ProcUBO();
|
||||||
virtual bool ProcSSBO();
|
virtual bool ProcSSBO();
|
||||||
virtual bool ProcConst();
|
virtual bool ProcConst();
|
||||||
@ -66,7 +70,7 @@ public:
|
|||||||
|
|
||||||
void AddFunction(const AnsiString &str){function_list.Add(str);}
|
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;}
|
void SetMain(const AnsiString &str){main_function=str;}
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ namespace
|
|||||||
constexpr const char vs_main[]=R"(
|
constexpr const char vs_main[]=R"(
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
HandoverMI(); //交接材质实例ID给下一个Shader
|
HandoverMI();
|
||||||
|
|
||||||
gl_Position=GetPosition2D();
|
gl_Position=GetPosition2D();
|
||||||
})";
|
})";
|
||||||
@ -31,12 +31,8 @@ void main()
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
MaterialPureColor2D(const Material2DConfig *c):Std2DMaterial(c)
|
using Std2DMaterial::Std2DMaterial;
|
||||||
{
|
|
||||||
mci->SetMaterialInstance( mi_codes, //材质实例glsl代码
|
|
||||||
mi_bytes, //材质实例数据大小
|
|
||||||
VK_SHADER_STAGE_FRAGMENT_BIT); //只在Fragment Shader中使用材质实例最终数据
|
|
||||||
}
|
|
||||||
~MaterialPureColor2D()=default;
|
~MaterialPureColor2D()=default;
|
||||||
|
|
||||||
bool CreateVertexShader(ShaderCreateInfoVertex *vsc) override
|
bool CreateVertexShader(ShaderCreateInfoVertex *vsc) override
|
||||||
@ -55,6 +51,15 @@ void main()
|
|||||||
fsc->SetMain(fs_main);
|
fsc->SetMain(fs_main);
|
||||||
return(true);
|
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
|
};//class MaterialPureColor2D:public Std2DMaterial
|
||||||
}//namespace
|
}//namespace
|
||||||
|
|
||||||
|
@ -40,6 +40,9 @@ bool Std2DMaterial::CreateVertexShader(ShaderCreateInfoVertex *vsc)
|
|||||||
|
|
||||||
MaterialCreateInfo *Std2DMaterial::Create()
|
MaterialCreateInfo *Std2DMaterial::Create()
|
||||||
{
|
{
|
||||||
|
if(!BeforeCreateShader())
|
||||||
|
return(nullptr);
|
||||||
|
|
||||||
if(mci->hasVertex())
|
if(mci->hasVertex())
|
||||||
if(!CreateVertexShader(mci->GetVS()))
|
if(!CreateVertexShader(mci->GetVS()))
|
||||||
return(nullptr);
|
return(nullptr);
|
||||||
@ -52,6 +55,9 @@ MaterialCreateInfo *Std2DMaterial::Create()
|
|||||||
if(!CreateFragmentShader(mci->GetFS()))
|
if(!CreateFragmentShader(mci->GetFS()))
|
||||||
return(nullptr);
|
return(nullptr);
|
||||||
|
|
||||||
|
if(!AfterCreateShader())
|
||||||
|
return(false);
|
||||||
|
|
||||||
if(!mci->CreateShader())
|
if(!mci->CreateShader())
|
||||||
return(nullptr);
|
return(nullptr);
|
||||||
|
|
||||||
|
@ -25,10 +25,14 @@ namespace hgl
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
virtual bool BeforeCreateShader(){return true;/*some work before creating shader*/};
|
||||||
|
|
||||||
virtual bool CreateVertexShader(ShaderCreateInfoVertex *);
|
virtual bool CreateVertexShader(ShaderCreateInfoVertex *);
|
||||||
virtual bool CreateGeometryShader(ShaderCreateInfoGeometry *){return false;}
|
virtual bool CreateGeometryShader(ShaderCreateInfoGeometry *){return false;}
|
||||||
virtual bool CreateFragmentShader(ShaderCreateInfoFragment *)=0;
|
virtual bool CreateFragmentShader(ShaderCreateInfoFragment *)=0;
|
||||||
|
|
||||||
|
virtual bool AfterCreateShader(){return true;/*some work after creating shader*/};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Std2DMaterial(const Material2DConfig *);
|
Std2DMaterial(const Material2DConfig *);
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include<hgl/filesystem/FileSystem.h>
|
#include<hgl/filesystem/FileSystem.h>
|
||||||
#include<vulkan/vulkan.h>
|
#include<vulkan/vulkan.h>
|
||||||
#include<hgl/graph/VKPhysicalDevice.h>
|
#include<hgl/graph/VKPhysicalDevice.h>
|
||||||
|
#include<hgl/log/Logger.h>
|
||||||
|
|
||||||
namespace hgl
|
namespace hgl
|
||||||
{
|
{
|
||||||
@ -171,6 +172,8 @@ namespace hgl
|
|||||||
|
|
||||||
if(!result)
|
if(!result)
|
||||||
{
|
{
|
||||||
|
LOG_ERROR(U8_TEXT("Compile shader failed, error info: ")+UTF8String(spv->log));
|
||||||
|
|
||||||
FreeSPVData(spv);
|
FreeSPVData(spv);
|
||||||
return(nullptr);
|
return(nullptr);
|
||||||
}
|
}
|
||||||
|
@ -148,6 +148,7 @@ bool MaterialCreateInfo::SetMaterialInstance(const AnsiString &mi_glsl_codes,con
|
|||||||
hgl::strcpy(ubo->name,DESCRIPTOR_NAME_MAX_LENGTH,SBS_MaterialInstanceData.name);
|
hgl::strcpy(ubo->name,DESCRIPTOR_NAME_MAX_LENGTH,SBS_MaterialInstanceData.name);
|
||||||
ubo->stage_flag=shader_stage;
|
ubo->stage_flag=shader_stage;
|
||||||
|
|
||||||
|
mdi.AddStruct(SBS_MaterialInstanceData.struct_name,SBS_MaterialInstanceData.codes);
|
||||||
mdi.AddUBO(shader_stage,DescriptorSetType::PerMaterial,ubo);
|
mdi.AddUBO(shader_stage,DescriptorSetType::PerMaterial,ubo);
|
||||||
|
|
||||||
auto *it=shader_map.GetDataList();
|
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++)
|
for(int i=0;i<shader_map.GetCount();i++)
|
||||||
{
|
{
|
||||||
if((*it)->key&shader_stage)
|
if((*it)->key&shader_stage)
|
||||||
(*it)->value->SetMaterialInstance(ubo);
|
(*it)->value->SetMaterialInstance(ubo,mi_codes);
|
||||||
|
|
||||||
|
++it;
|
||||||
}
|
}
|
||||||
|
|
||||||
vert->AddMaterialInstanceID(); //增加一个材质实例ID
|
vert->AddMaterialInstanceID(); //增加一个材质实例ID
|
||||||
|
@ -76,11 +76,13 @@ bool ShaderCreateInfo::ProcSubpassInput()
|
|||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShaderCreateInfo::SetMaterialInstance(UBODescriptor *ubo)
|
void ShaderCreateInfo::SetMaterialInstance(UBODescriptor *ubo,const AnsiString &mi)
|
||||||
{
|
{
|
||||||
sdm->AddUBO(DescriptorSetType::PerMaterial,ubo);
|
sdm->AddUBO(DescriptorSetType::PerMaterial,ubo);
|
||||||
sdm->AddStruct(mtl::MaterialInstanceStruct);
|
sdm->AddStruct(mtl::MaterialInstanceStruct);
|
||||||
AddFunction(mtl::func::GetMI);
|
AddFunction(mtl::func::GetMI);
|
||||||
|
|
||||||
|
mi_codes=mi;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ShaderCreateInfo::ProcInput(ShaderCreateInfo *last_sc)
|
bool ShaderCreateInfo::ProcInput(ShaderCreateInfo *last_sc)
|
||||||
@ -120,7 +122,7 @@ bool ShaderCreateInfo::ProcOutput()
|
|||||||
|
|
||||||
for(uint i=0;i<ssd.count;i++)
|
for(uint i=0;i<ssd.count;i++)
|
||||||
{
|
{
|
||||||
output_struct+="\t";
|
output_struct+=" ";
|
||||||
|
|
||||||
if(ss->interpolation!=Interpolation::Smooth)
|
if(ss->interpolation!=Interpolation::Smooth)
|
||||||
{
|
{
|
||||||
@ -167,6 +169,17 @@ bool ShaderCreateInfo::ProcStruct()
|
|||||||
return(true);
|
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()
|
bool ShaderCreateInfo::ProcUBO()
|
||||||
{
|
{
|
||||||
auto ubo_list=sdm->GetUBOList();
|
auto ubo_list=sdm->GetUBOList();
|
||||||
@ -187,7 +200,7 @@ bool ShaderCreateInfo::ProcUBO()
|
|||||||
final_shader+=AnsiString::numberOf((*ubo)->binding);
|
final_shader+=AnsiString::numberOf((*ubo)->binding);
|
||||||
final_shader+=") uniform ";
|
final_shader+=") uniform ";
|
||||||
final_shader+=(*ubo)->type;
|
final_shader+=(*ubo)->type;
|
||||||
final_shader+="{\n";
|
final_shader+="\n{";
|
||||||
|
|
||||||
if(!mdi->GetStruct((*ubo)->type,struct_codes))
|
if(!mdi->GetStruct((*ubo)->type,struct_codes))
|
||||||
return(false);
|
return(false);
|
||||||
@ -282,6 +295,8 @@ bool ShaderCreateInfo::CreateShader(ShaderCreateInfo *last_sc)
|
|||||||
// if(!ProcStruct())
|
// if(!ProcStruct())
|
||||||
// return(false);
|
// return(false);
|
||||||
|
|
||||||
|
ProcMI();
|
||||||
|
|
||||||
if(!ProcUBO())
|
if(!ProcUBO())
|
||||||
return(false);
|
return(false);
|
||||||
//if(!ProcSSBO())
|
//if(!ProcSSBO())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user