completed MaterialInstance codes in ShaderGen
This commit is contained in:
parent
1668a0c973
commit
a04742c347
@ -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=
|
||||
|
@ -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;}
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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 *);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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())
|
||||
|
Loading…
x
Reference in New Issue
Block a user