maybe finished, all examples test OK!

This commit is contained in:
hyzboy 2024-06-20 00:16:29 +08:00
parent 2f49e80122
commit 56b8798122
22 changed files with 177 additions and 67 deletions

@ -1 +1 @@
Subproject commit b0955107a7d55ec050cb8cec2378ffbacd228096
Subproject commit 3bc0658d28e30457907003d85151b3b46083af53

View File

@ -1,6 +1,7 @@
#pragma once
#include<hgl/type/String.h>
#include<hgl/type/List.h>
#include<hgl/graph/VertexAttrib.h>
#include<hgl/graph/VKInterpolation.h>
#include<hgl/graph/VKSamplerType.h>
@ -380,6 +381,8 @@ namespace hgl
Interpolation interpolation; //插值方式
};
using SVList=List<ShaderVariable>;
struct ShaderVariableArray
{
uint count;
@ -531,9 +534,11 @@ namespace hgl
if(sv->interpolation!=Interpolation::Smooth)
{
output_string+=InterpolationName[size_t(sv->interpolation)];
output_string+=" ";
if(RangeCheck(sv->interpolation))
{
output_string+=InterpolationName[size_t(sv->interpolation)];
output_string+=" ";
}
}
output_string+=sv->type.GetTypename();

View File

@ -25,6 +25,7 @@ public:
ShaderCreateInfoFragment(MaterialDescriptorInfo *m):ShaderCreateInfo(){ShaderCreateInfo::Init(&fsdi,m);}
~ShaderCreateInfoFragment()=default;
int AddOutput(VIAList &);
int AddOutput(const graph::VAType &type,const AnsiString &name,Interpolation inter=Interpolation::Smooth);
int AddOutput(const AnsiString &type,const AnsiString &name,Interpolation inter=Interpolation::Smooth);
};

View File

@ -26,6 +26,7 @@ public:
bool SetGeom(const Prim &ip,const Prim &op,const uint32_t mv);
int AddOutput(SVList &);
int AddOutput(const ShaderVariableType &type,const AnsiString &name,Interpolation inter=Interpolation::Smooth);
void AddMaterialInstanceOutput() override;

View File

@ -18,6 +18,8 @@ namespace hgl
void GetOutputStrcutString(AnsiString &str) override;
public:
VIAArray &GetInput(){return vsdi.GetInput();}
ShaderDescriptorInfo *GetSDI()override{return &vsdi;}
@ -26,11 +28,13 @@ namespace hgl
ShaderCreateInfoVertex(MaterialDescriptorInfo *m):ShaderCreateInfo(){ShaderCreateInfo::Init(&vsdi,m);}
~ShaderCreateInfoVertex()override=default;
int AddInput(VIAList &);
int AddInput(const graph::VAType &type,const AnsiString &name,const VkVertexInputRate input_rate=VK_VERTEX_INPUT_RATE_VERTEX,const VertexInputGroup &group=VertexInputGroup::Basic);
int AddInput(const AnsiString &type,const AnsiString &name,const VkVertexInputRate input_rate=VK_VERTEX_INPUT_RATE_VERTEX,const VertexInputGroup &group=VertexInputGroup::Basic);
int hasInput(const char *);
int AddOutput(SVList &);
int AddOutput(const SVType &type,const AnsiString &name,Interpolation inter=Interpolation::Smooth);
void AddMaterialInstanceOutput() override;

View File

@ -123,7 +123,7 @@ Material *RenderResource::CreateMaterial(const mtl::MaterialCreateInfo *mci)
ShaderCreateInfoVertex *vert=mci->GetVS();
if(vert)
mtl->vertex_input=GetVertexInput(vert->sdi->GetShaderStageIO().input);
mtl->vertex_input=GetVertexInput(vert->GetInput());
}
{

View File

@ -37,7 +37,7 @@ void main()
vsc->AddInput(VAT_VEC2,VAN::TexCoord);
vsc->AddOutput(VAT_VEC2,"TexCoord");
vsc->AddOutput(SVT_VEC2,"TexCoord");
vsc->SetMain(vs_main);
return(true);

View File

@ -54,7 +54,7 @@ void main()
vsc->AddInput(VAT_VEC4,VAN::TexCoord);
vsc->AddOutput(VAT_VEC4,"TexCoord");
vsc->AddOutput(SVT_VEC4,"TexCoord");
vsc->SetMain(vs_main);
return(true);
@ -64,7 +64,7 @@ void main()
{
gsc->SetGeom(Prim::Points,Prim::TriangleStrip,4);
gsc->AddOutput(VAT_VEC2,"TexCoord");
gsc->AddOutput(SVT_VEC2,"TexCoord");
gsc->SetMain(gs_main);
return(true);

View File

@ -61,7 +61,7 @@ void main()
vsc->AddInput(VAT_VEC4,VAN::TexCoord);
vsc->AddOutput(VAT_VEC4,"TexCoord");
vsc->AddOutput(SVT_VEC4,"TexCoord");
vsc->SetMain(vs_main);
return(true);
@ -71,7 +71,7 @@ void main()
{
gsc->SetGeom(Prim::Points,Prim::TriangleStrip,4);
gsc->AddOutput(VAT_VEC2,"TexCoord");
gsc->AddOutput(SVT_VEC2,"TexCoord");
gsc->SetMain(gs_main);
return(true);

View File

@ -38,7 +38,7 @@ void main()
vsc->AddInput(VAT_VEC4,VAN::Color);
vsc->AddOutput(VAT_VEC4,"Color");
vsc->AddOutput(SVT_VEC4,"Color");
vsc->SetMain(vs_main);
return(true);

View File

@ -53,15 +53,15 @@ namespace
return true;
}
material_file::ShaderData *CommonProc(VkShaderStageFlagBits ss,ShaderCreateInfo *sc)
template<VkShaderStageFlagBits ss,typename SD,typename SCI>
SD *CommonProc(SCI *sc)
{
material_file::ShaderData *sd=mfd->shader[ss];
SD *sd=(SD *)(mfd->shader[ss]);
if(!sd)
return(nullptr);
for(auto &ua:sd->output)
sc->AddOutput(ua.vat,ua.name);
sc->AddOutput(sd->output);
for(auto &s:sd->sampler)
mci->AddSampler(ss,DescriptorSetType::PerMaterial,s.type,s.name);
@ -73,18 +73,17 @@ namespace
bool CustomVertexShader(ShaderCreateInfoVertex *vsc) override
{
for(auto &ua:mfd->vi)
vsc->AddInput(ua.vat,ua.name);
vsc->AddInput(mfd->via);
if(!Std2DMaterial::CustomVertexShader(vsc))
return(false);
return CommonProc(VK_SHADER_STAGE_VERTEX_BIT,vsc);
return CommonProc<VK_SHADER_STAGE_VERTEX_BIT,material_file::VertexShaderData,ShaderCreateInfoVertex>(vsc);
}
bool CustomGeometryShader(ShaderCreateInfoGeometry *gsc) override
{
material_file::GeometryShaderData *sd=(material_file::GeometryShaderData *)CommonProc(VK_SHADER_STAGE_GEOMETRY_BIT,gsc);
material_file::GeometryShaderData *sd=CommonProc<VK_SHADER_STAGE_GEOMETRY_BIT,material_file::GeometryShaderData,ShaderCreateInfoGeometry>(gsc);
if(!sd)
return(false);
@ -96,7 +95,7 @@ namespace
bool CustomFragmentShader(ShaderCreateInfoFragment *fsc) override
{
return CommonProc(VK_SHADER_STAGE_FRAGMENT_BIT,fsc);
return CommonProc<VK_SHADER_STAGE_FRAGMENT_BIT,material_file::FragmentShaderData,ShaderCreateInfoFragment>(fsc);
}
};//class Std2DMaterialLoader:public Std2DMaterial
}//namespace

View File

@ -57,7 +57,7 @@ void main()
if(!Std3DMaterial::CustomVertexShader(vsc))
return(false);
vsc->AddOutput(VAT_UINT,"l2w_id",Interpolation::Flat);
vsc->AddOutput(SVT_UINT,"l2w_id",Interpolation::Flat);
vsc->SetMain(vs_main);
return(true);
@ -67,7 +67,7 @@ void main()
{
gsc->SetGeom(Prim::Points,Prim::TriangleStrip,4);
gsc->AddOutput(VAT_VEC2,"TexCoord");
gsc->AddOutput(SVT_VEC2,"TexCoord");
gsc->SetMain(gs_main);
return(true);

View File

@ -59,7 +59,7 @@ void main()
if(!Std3DMaterial::CustomVertexShader(vsc))
return(false);
vsc->AddOutput(VAT_VEC2,"BillboardSize");
vsc->AddOutput(SVT_VEC2,"BillboardSize");
vsc->SetMain(vs_main);
return(true);
@ -69,7 +69,7 @@ void main()
{
gsc->SetGeom(Prim::Points,Prim::TriangleStrip,4);
gsc->AddOutput(VAT_VEC2,"TexCoord");
gsc->AddOutput(SVT_VEC2,"TexCoord");
gsc->SetMain(gs_main);
return(true);

View File

@ -38,7 +38,7 @@ void main()
vsc->AddInput(VAT_VEC4,VAN::Color);
vsc->AddOutput(VAT_VEC4,"Color");
vsc->AddOutput(SVT_VEC4,"Color");
vsc->SetMain(vs_main);
return(true);

View File

@ -43,7 +43,7 @@ void main()
vsc->AddInput(VAT_FLOAT,VAN::Luminance);
vsc->AddOutput(VAT_VEC4,"Color");
vsc->AddOutput(SVT_VEC4,"Color");
vsc->SetMain(vs_main);
return(true);

View File

@ -53,16 +53,16 @@ namespace
return true;
}
material_file::ShaderData *CommonProc(VkShaderStageFlagBits ss,ShaderCreateInfo *sc)
template<VkShaderStageFlagBits ss,typename SD,typename SCI>
SD *CommonProc(SCI *sc)
{
material_file::ShaderData *sd=mfd->shader[ss];
SD *sd=(SD *)(mfd->shader[ss]);
if(!sd)
return (nullptr);
for(auto &ua:sd->output)
sc->AddOutput(ua.vat,ua.name);
sc->AddOutput(sd->output);
for(auto &s:sd->sampler)
mci->AddSampler(ss,DescriptorSetType::PerMaterial,s.type,s.name);
@ -74,18 +74,17 @@ namespace
bool CustomVertexShader(ShaderCreateInfoVertex *vsc) override
{
for(auto &ua:mfd->vi)
vsc->AddInput(ua.vat,ua.name);
vsc->AddInput(mfd->via);
if(!Std3DMaterial::CustomVertexShader(vsc))
return (false);
return CommonProc(VK_SHADER_STAGE_VERTEX_BIT,vsc);
return CommonProc<VK_SHADER_STAGE_VERTEX_BIT,material_file::VertexShaderData,ShaderCreateInfoVertex>(vsc);
}
bool CustomGeometryShader(ShaderCreateInfoGeometry *gsc) override
{
material_file::GeometryShaderData *sd=(material_file::GeometryShaderData *)CommonProc(VK_SHADER_STAGE_GEOMETRY_BIT,gsc);
material_file::GeometryShaderData *sd=CommonProc<VK_SHADER_STAGE_GEOMETRY_BIT,material_file::GeometryShaderData,ShaderCreateInfoGeometry>(gsc);
if(!sd)
return (false);
@ -97,7 +96,7 @@ namespace
bool CustomFragmentShader(ShaderCreateInfoFragment *fsc) override
{
return CommonProc(VK_SHADER_STAGE_FRAGMENT_BIT,fsc);
return CommonProc<VK_SHADER_STAGE_FRAGMENT_BIT,material_file::FragmentShaderData,ShaderCreateInfoFragment>(fsc);
}
}; // class Std3DMaterialLoader:public Std3DMaterial
} // namespace

View File

@ -68,19 +68,17 @@ namespace material_file
}
const VkShaderStageFlagBits GetShaderStage()const{return shader_stage;}
virtual void AddOutput(const ShaderVariable &sv);
};
struct VertexShaderData:public ShaderData
{
List<ShaderVariable> output;
SVList output;
VertexShaderData():ShaderData(VK_SHADER_STAGE_VERTEX_BIT){}
public:
void AddOutput(const ShaderVariable &sv)override{output.Add(sv);}
void AddOutput(const ShaderVariable &sv){output.Add(sv);}
};
struct GeometryShaderData:public ShaderData
@ -89,7 +87,7 @@ namespace material_file
Prim output_prim;
uint max_vertices=0;
List<ShaderVariable> output;
SVList output;
public:
@ -97,18 +95,16 @@ namespace material_file
public:
void AddOutput(const ShaderVariable &sv)override{output.Add(sv);}
void AddOutput(const ShaderVariable &sv){output.Add(sv);}
};
struct FragmentShaderData:public ShaderData
{
List<VIA> output;
VIAList output;
FragmentShaderData():ShaderData(VK_SHADER_STAGE_FRAGMENT_BIT){}
public:
void AddOutput(const ShaderVariable &sv)override{}
void AddOutput(const VIA &via){output.Add(via);}
};
using ShaderDataMap=ObjectMap<VkShaderStageFlagBits,ShaderData>;
@ -131,7 +127,7 @@ namespace material_file
MaterialInstanceData mi{};
List<VIA> via; ///<Vertex Input
VIAList via; ///<Vertex Input
UBODataList ubo_list;

View File

@ -346,12 +346,37 @@ namespace
}
};//struct MaterialInstanceBlockParse
bool ParseVertexInputAttrib(VIA *via,const char *str)
bool ParseInterpolation(Interpolation *inter,const char *name)
{
if(!inter)return(false);
if(!name||!*name)return(false);
for(int i=(int)Interpolation::Smooth;i<(int)Interpolation::Flat;i++)
if(!strcmp(name,InterpolationName[i],sizeof(InterpolationName[i])))
{
*inter=Interpolation(i);
return(true);
}
return(false);
}
bool ParseOutputItem(VIA *via,const char *str)
{
const char *sp;
while(*str==' '||*str=='\t')++str;
if(ParseInterpolation(&(via->interpolation),str))
{
while(*str!=' '&&*str!='\t')++str;
while(*str==' '||*str=='\t')++str;
}
else
{
via->interpolation=Interpolation::Smooth;
}
VAType vat;
if(!ParseVertexAttribType(&(vat),str))
@ -372,12 +397,22 @@ namespace
return(true);
}
bool ParseUniformAttrib(ShaderVariable *sv,const char *str)
bool ParseOutputItem(ShaderVariable *sv,const char *str)
{
const char *sp;
while(*str==' '||*str=='\t')++str;
if(ParseInterpolation(&(sv->interpolation),str))
{
while(*str!=' '&&*str!='\t')++str;
while(*str==' '||*str=='\t')++str;
}
else
{
sv->interpolation=Interpolation::Smooth;
}
if(!sv->type.ParseTypeString(str))
return(false);
@ -411,16 +446,17 @@ namespace
VIA via;
if(ParseVertexInputAttrib(&via,text))
if(ParseOutputItem(&via,text))
via_list->Add(via);
return(true);
}
};//struct VertexInputBlockParse
template<typename SD,typename OIT>
struct ShaderBlockParse:public TextParse
{
ShaderData * shader_data=nullptr;
SD * shader_data=nullptr;
bool output=false;
@ -429,7 +465,7 @@ namespace
public:
ShaderBlockParse(ShaderData *sd)
ShaderBlockParse(SD *sd)
{
shader_data=sd;
}
@ -460,10 +496,10 @@ namespace
return(true);
}
ShaderVariable sv;
OIT output_item;
if(ParseUniformAttrib(&sv,text))
shader_data->AddOutput(sv);
if(ParseOutputItem(&output_item,text))
shader_data->AddOutput(output_item);
}
if(hgl::stricmp(text,"Code",4)==0)
@ -507,7 +543,10 @@ namespace
}
};//struct ShaderBlockParse
struct GeometryShaderBlockParse:public ShaderBlockParse
using VertexShaderBlockParse=ShaderBlockParse<VertexShaderData,ShaderVariable>;
using FragmentShaderBlockParse=ShaderBlockParse<FragmentShaderData,VIA>;
struct GeometryShaderBlockParse:public ShaderBlockParse<GeometryShaderData,ShaderVariable>
{
GeometryShaderData *gsd=nullptr;
@ -576,7 +615,6 @@ namespace
return(true);
}
};//struct GeometryShaderBlockParse
struct MaterialTextParse:public TextParse
@ -620,7 +658,7 @@ namespace
parse=new MaterialInstanceBlockParse(&(mfd->mi));
else
if(state==MaterialFileBlock::VertexInput)
parse=new VertexInputBlockParse(&(mfd->vi));
parse=new VertexInputBlockParse(&(mfd->via));
else
if(state>=MaterialFileBlock::Vertex
&&state<=MaterialFileBlock::Fragment)
@ -629,23 +667,23 @@ namespace
if(state==MaterialFileBlock::Vertex)
{
sd=new ShaderData(VK_SHADER_STAGE_VERTEX_BIT);
sd=new VertexShaderData();
parse=new ShaderBlockParse(sd);
parse=new VertexShaderBlockParse((VertexShaderData *)sd);
}
else
if(state==MaterialFileBlock::Geometry)
{
sd=new GeometryShaderData(VK_SHADER_STAGE_GEOMETRY_BIT);
sd=new GeometryShaderData();
parse=new GeometryShaderBlockParse((GeometryShaderData *)sd);
}
else
if(state==MaterialFileBlock::Fragment)
{
sd=new ShaderData(VK_SHADER_STAGE_FRAGMENT_BIT);
sd=new FragmentShaderData();
parse=new ShaderBlockParse(sd);
parse=new FragmentShaderBlockParse((FragmentShaderData *)sd);
}
if(!sd)

View File

@ -2,7 +2,24 @@
#include<hgl/shadergen/ShaderDescriptorInfo.h>
namespace hgl{namespace graph{
int ShaderCreateInfoFragment::AddOutput(VIAList &via_list)
{
int count=0;
for(VIA &via:via_list)
{
//都输出了,没这些值
//via.input_rate=VK_VERTEX_INPUT_RATE_VERTEX;
//via.group=VertexInputGroup::Basic;
if(fsdi.AddOutput(via))
++count;
}
return count;
}
int ShaderCreateInfoFragment::AddOutput(const VAType &type,const AnsiString &name,Interpolation inter)
{
VertexInputAttribute via;

View File

@ -26,6 +26,21 @@ namespace hgl
AddFunction(mtl::func::MF_HandoverMI_GS);
}
int ShaderCreateInfoGeometry::AddOutput(SVList &sv_list)
{
int count=0;
for(ShaderVariable &sv:sv_list)
{
sv.interpolation=Interpolation::Smooth;
if(gsdi.AddOutput(sv))
++count;
}
return count;
}
int ShaderCreateInfoGeometry::AddOutput(const SVType &type,const AnsiString &name,Interpolation inter)
{
ShaderVariable sv;

View File

@ -14,9 +14,25 @@ void ShaderCreateInfoVertex::AddMaterialInstanceOutput()
AddFunction(mtl::func::MF_HandoverMI_VS);
}
int ShaderCreateInfoVertex::AddInput(VIAList &via_list)
{
int count=0;
for(VIA &via:via_list)
{
via.input_rate=VK_VERTEX_INPUT_RATE_VERTEX;
via.group=VertexInputGroup::Basic;
if(vsdi.AddInput(via))
++count;
}
return count;
}
int ShaderCreateInfoVertex::AddInput(const VAType &type,const AnsiString &name,const VkVertexInputRate input_rate,const VertexInputGroup &group)
{
VertexInputAttribute via;
VIA via;
hgl::strcpy(via.name,sizeof(via.name),name.c_str());
@ -26,6 +42,8 @@ int ShaderCreateInfoVertex::AddInput(const VAType &type,const AnsiString &name,c
via.input_rate =input_rate;
via.group =group;
via.interpolation =Interpolation::Smooth;
return vsdi.AddInput(via);
}
@ -44,6 +62,21 @@ int ShaderCreateInfoVertex::hasInput(const char *name)
return vsdi.hasInput(name);
}
int ShaderCreateInfoVertex::AddOutput(SVList &sv_list)
{
int count=0;
for(ShaderVariable &sv:sv_list)
{
sv.interpolation=Interpolation::Smooth;
if(vsdi.AddOutput(sv))
++count;
}
return count;
}
int ShaderCreateInfoVertex::AddOutput(const SVType &type,const AnsiString &name,Interpolation inter)
{
ShaderVariable sv;

View File

@ -265,5 +265,7 @@ bool ShaderVariableType::ParseTypeString(const char *str)
base_type=SVBaseType::AtomicCounter;
return(true);
}
return(false);
}
VK_NAMESPACE_END