finished StdMaterialLoader, test all examples ok.

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-10-10 14:49:33 +08:00
parent 3dd308aff1
commit 8a5711154f
13 changed files with 155 additions and 49 deletions

2
CMCore

@ -1 +1 @@
Subproject commit 15b86eaf3bf661cff9f21d9b53a334a7b5e358e4
Subproject commit 460dc1c5ecfba0f0cef93026be5d25a4f86605b1

@ -1 +1 @@
Subproject commit b5b5b0b2e7b00ec3d399659573ba40db8ec8e175
Subproject commit 88f064043f1402ced42c91ecb34f26a2b229a134

View File

@ -23,7 +23,7 @@ Code
#Fragment
Sampler2D TextureColor
sampler2D TextureColor
Output
{

View File

@ -52,7 +52,7 @@ Code
#Fragment
Sampler2D TextureColor
sampler2D TextureColor
Output
{

View File

@ -61,7 +61,7 @@ Code
#Fragment
Sampler2DArray TextureColor
sampler2DArray TextureColor
Output
{

View File

@ -36,7 +36,8 @@ private:
cfg.local_to_world=true;
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreateVertexLuminance3D(&cfg);
//AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreateVertexLuminance3D(&cfg);
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::LoadMaterialFromFile("Std3D/VertexLum3D",&cfg);
material=db->CreateMaterial(mci);
if(!material)return(false);

View File

@ -60,7 +60,8 @@ private:
cfg.local_to_world=true;
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreateVertexLuminance3D(&cfg);
//AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreateVertexLuminance3D(&cfg);
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::LoadMaterialFromFile("Std3D/VertexLum3D",&cfg);
material=db->CreateMaterial(mci);
if(!material)return(false);

View File

@ -56,7 +56,8 @@ private:
cfg.coordinate_system=CoordinateSystem2D::NDC;
cfg.local_to_world=false;
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreatePureTexture2D(&cfg);
//AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreatePureTexture2D(&cfg);
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::LoadMaterialFromFile("Std2D/PureTexture2D",&cfg);
material=db->CreateMaterial(mci);

View File

@ -94,7 +94,8 @@ private:
cfg.coordinate_system=CoordinateSystem2D::ZeroToOne;
cfg.local_to_world=true;
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreateRectTexture2DArray(&cfg);
//AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreateRectTexture2DArray(&cfg);
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::LoadMaterialFromFile("Std2D/RectTexture2DArray",&cfg);
material=db->CreateMaterial(mci);

View File

@ -50,6 +50,6 @@ MaterialCreateInfo *CreateRectTexture2DArray(Material2DCreateConfig *);
* @param cfg
* @return
*/
MaterialCreateInfo *LoadMaterialFromFile(const AnsiString &mtl_name,const Material2DCreateConfig *cfg); ///<从文件加载材质
MaterialCreateInfo *LoadMaterialFromFile(const AnsiString &mtl_name,Material2DCreateConfig *cfg); ///<从文件加载材质
STD_MTL_NAMESPACE_END
#endif//HGL_GRAPH_MTL_2D_CREATE_CONFIG_INCLUDE

View File

@ -38,4 +38,12 @@ MaterialCreateInfo *CreateVertexLuminance3D(const Material3DCreateConfig *);
//MaterialCreateInfo *CreatePureTexture2D(const Material2DCreateConfig *);
//MaterialCreateInfo *CreateRectTexture2D(Material2DCreateConfig *);
//MaterialCreateInfo *CreateRectTexture2DArray(Material2DCreateConfig *);
/**
*
* @param mtl_name
* @param cfg
* @return
*/
MaterialCreateInfo *LoadMaterialFromFile(const AnsiString &name,Material3DCreateConfig *cfg);
STD_MTL_NAMESPACE_END

View File

@ -39,78 +39,68 @@ namespace
return true;
}
material_file::ShaderData *CommonProc(VkShaderStageFlagBits ss,ShaderCreateInfo *sc)
{
material_file::ShaderData *sd=mfd->shader[ss];
if(!sd)
return(nullptr);
for(auto &ua:sd->output)
sc->AddOutput(ua.vat,ua.name);
for(auto &s:sd->sampler)
mci->AddSampler(ss,DescriptorSetType::PerMaterial,s.type,s.name);
sc->SetMain(sd->code,sd->code_length); //这里会产生复制这个string但我不希望产生这个。未来想办法改进
return sd;
}
bool CustomVertexShader(ShaderCreateInfoVertex *vsc) override
{
if(!Std2DMaterial::CustomVertexShader(vsc))
return(false);
if(mfd->vi.GetCount()>0)
{
for(auto &ua:mfd->vi)
vsc->AddInput(ua.vat,ua.name);
}
for(auto &ua:mfd->vi)
vsc->AddInput(ua.vat,ua.name);
material_file::ShaderData *sd=mfd->shader[VK_SHADER_STAGE_VERTEX_BIT];
if(!sd)
return(false);
for(auto &ua:sd->output)
vsc->AddOutput(ua.vat,ua.name);
vsc->SetMain(sd->code,sd->code_length); //这里会产生复制这个string但我不希望产生这个。未来想办法改进
return true;
return CommonProc(VK_SHADER_STAGE_VERTEX_BIT,vsc);
}
bool CustomGeometryShader(ShaderCreateInfoGeometry *gsc) override
{
if(!Std2DMaterial::CustomGeometryShader(gsc))
return(false);
material_file::GeometryShaderData *sd=(material_file::GeometryShaderData *)(mfd->shader[VK_SHADER_STAGE_GEOMETRY_BIT]);
material_file::GeometryShaderData *sd=(material_file::GeometryShaderData *)CommonProc(VK_SHADER_STAGE_GEOMETRY_BIT,gsc);
if(!sd)
return(false);
gsc->SetGeom(sd->input_prim,sd->output_prim,sd->max_vertices);
for(auto &ua:sd->output)
gsc->AddOutput(ua.vat,ua.name);
gsc->SetMain(sd->code,sd->code_length); //这里会产生复制这个string但我不希望产生这个。未来想办法改进
return true;
}
bool CustomFragmentShader(ShaderCreateInfoFragment *fsc) override
{
material_file::ShaderData *sd=mfd->shader[VK_SHADER_STAGE_FRAGMENT_BIT];
if(!sd)
return(false);
for(auto &ua:sd->output)
fsc->AddOutput(ua.vat,ua.name);
fsc->SetMain(sd->code,sd->code_length); //这里会产生复制这个string但我不希望产生这个。未来想办法改进
return true;
return CommonProc(VK_SHADER_STAGE_FRAGMENT_BIT,fsc);
}
bool EndCustomShader() override{return true;}
};//class Std2DMaterialLoader:public Std2DMaterial
}//namespace
material_file::MaterialFileData *LoadMaterialDataFromFile(const AnsiString &mtl_filename);
MaterialCreateInfo *LoadMaterialFromFile(const AnsiString &name,const Material2DCreateConfig *cfg)
MaterialCreateInfo *LoadMaterialFromFile(const AnsiString &name,Material2DCreateConfig *cfg)
{
if(name.IsEmpty()||!cfg)
return(nullptr);
material_file::MaterialFileData *mfd=LoadMaterialDataFromFile(name);
if(!mfd)
return nullptr;
cfg->shader_stage_flag_bit=mfd->shader_stage_flag_bit;
Std2DMaterialLoader mtl(mfd,cfg);
return mtl.Create();

View File

@ -0,0 +1,104 @@
#include "MaterialFileData.h"
#include "Std3DMaterial.h"
#include <hgl/shadergen/MaterialCreateInfo.h>
STD_MTL_NAMESPACE_BEGIN
namespace {
class Std3DMaterialLoader : public Std3DMaterial {
protected:
material_file::MaterialFileData* mfd;
public:
Std3DMaterialLoader(material_file::MaterialFileData* data, const Material3DCreateConfig* cfg)
: Std3DMaterial(cfg)
{
mfd = data;
}
~Std3DMaterialLoader()
{
delete mfd;
}
bool BeginCustomShader() override
{
if (!Std3DMaterial::BeginCustomShader())
return (false);
if (mfd->mi.mi_bytes > 0) {
mci->SetMaterialInstance(mfd->mi.code,
mfd->mi.mi_bytes,
mfd->mi.shader_stage_flag_bits);
}
return true;
}
material_file::ShaderData* CommonProc(VkShaderStageFlagBits ss, ShaderCreateInfo* sc)
{
material_file::ShaderData* sd = mfd->shader[ss];
if (!sd)
return (nullptr);
for (auto& ua : sd->output)
sc->AddOutput(ua.vat, ua.name);
for (auto& s : sd->sampler)
mci->AddSampler(ss, DescriptorSetType::PerMaterial, s.type, s.name);
sc->SetMain(sd->code, sd->code_length); // 这里会产生复制这个string但我不希望产生这个。未来想办法改进
return sd;
}
bool CustomVertexShader(ShaderCreateInfoVertex* vsc) override
{
if (!Std3DMaterial::CustomVertexShader(vsc))
return (false);
for (auto& ua : mfd->vi)
vsc->AddInput(ua.vat, ua.name);
return CommonProc(VK_SHADER_STAGE_VERTEX_BIT, vsc);
}
bool CustomGeometryShader(ShaderCreateInfoGeometry* gsc) override
{
material_file::GeometryShaderData* sd = (material_file::GeometryShaderData*)CommonProc(VK_SHADER_STAGE_GEOMETRY_BIT, gsc);
if (!sd)
return (false);
gsc->SetGeom(sd->input_prim, sd->output_prim, sd->max_vertices);
return true;
}
bool CustomFragmentShader(ShaderCreateInfoFragment* fsc) override
{
return CommonProc(VK_SHADER_STAGE_FRAGMENT_BIT, fsc);
}
}; // class Std3DMaterialLoader:public Std3DMaterial
} // namespace
material_file::MaterialFileData* LoadMaterialDataFromFile(const AnsiString& mtl_filename);
MaterialCreateInfo* LoadMaterialFromFile(const AnsiString& name, Material3DCreateConfig* cfg)
{
if (name.IsEmpty() || !cfg)
return (nullptr);
material_file::MaterialFileData* mfd = LoadMaterialDataFromFile(name);
if (!mfd)
return nullptr;
cfg->shader_stage_flag_bit = mfd->shader_stage_flag_bit;
Std3DMaterialLoader mtl(mfd, cfg);
return mtl.Create();
}
STD_MTL_NAMESPACE_END