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

View File

@ -25,6 +25,7 @@ public:
ShaderCreateInfoFragment(MaterialDescriptorInfo *m):ShaderCreateInfo(){ShaderCreateInfo::Init(&fsdi,m);} ShaderCreateInfoFragment(MaterialDescriptorInfo *m):ShaderCreateInfo(){ShaderCreateInfo::Init(&fsdi,m);}
~ShaderCreateInfoFragment()=default; ~ShaderCreateInfoFragment()=default;
int AddOutput(VIAList &);
int AddOutput(const graph::VAType &type,const AnsiString &name,Interpolation inter=Interpolation::Smooth); 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); 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); 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); int AddOutput(const ShaderVariableType &type,const AnsiString &name,Interpolation inter=Interpolation::Smooth);
void AddMaterialInstanceOutput() override; void AddMaterialInstanceOutput() override;

View File

@ -19,6 +19,8 @@ namespace hgl
public: public:
VIAArray &GetInput(){return vsdi.GetInput();}
ShaderDescriptorInfo *GetSDI()override{return &vsdi;} ShaderDescriptorInfo *GetSDI()override{return &vsdi;}
public: public:
@ -26,11 +28,13 @@ namespace hgl
ShaderCreateInfoVertex(MaterialDescriptorInfo *m):ShaderCreateInfo(){ShaderCreateInfo::Init(&vsdi,m);} ShaderCreateInfoVertex(MaterialDescriptorInfo *m):ShaderCreateInfo(){ShaderCreateInfo::Init(&vsdi,m);}
~ShaderCreateInfoVertex()override=default; ~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 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 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 hasInput(const char *);
int AddOutput(SVList &);
int AddOutput(const SVType &type,const AnsiString &name,Interpolation inter=Interpolation::Smooth); int AddOutput(const SVType &type,const AnsiString &name,Interpolation inter=Interpolation::Smooth);
void AddMaterialInstanceOutput() override; void AddMaterialInstanceOutput() override;

View File

@ -123,7 +123,7 @@ Material *RenderResource::CreateMaterial(const mtl::MaterialCreateInfo *mci)
ShaderCreateInfoVertex *vert=mci->GetVS(); ShaderCreateInfoVertex *vert=mci->GetVS();
if(vert) 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->AddInput(VAT_VEC2,VAN::TexCoord);
vsc->AddOutput(VAT_VEC2,"TexCoord"); vsc->AddOutput(SVT_VEC2,"TexCoord");
vsc->SetMain(vs_main); vsc->SetMain(vs_main);
return(true); return(true);

View File

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

View File

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

View File

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

View File

@ -53,15 +53,15 @@ namespace
return true; 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) if(!sd)
return(nullptr); return(nullptr);
for(auto &ua:sd->output) sc->AddOutput(sd->output);
sc->AddOutput(ua.vat,ua.name);
for(auto &s:sd->sampler) for(auto &s:sd->sampler)
mci->AddSampler(ss,DescriptorSetType::PerMaterial,s.type,s.name); mci->AddSampler(ss,DescriptorSetType::PerMaterial,s.type,s.name);
@ -73,18 +73,17 @@ namespace
bool CustomVertexShader(ShaderCreateInfoVertex *vsc) override bool CustomVertexShader(ShaderCreateInfoVertex *vsc) override
{ {
for(auto &ua:mfd->vi) vsc->AddInput(mfd->via);
vsc->AddInput(ua.vat,ua.name);
if(!Std2DMaterial::CustomVertexShader(vsc)) if(!Std2DMaterial::CustomVertexShader(vsc))
return(false); 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 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) if(!sd)
return(false); return(false);
@ -96,7 +95,7 @@ namespace
bool CustomFragmentShader(ShaderCreateInfoFragment *fsc) override 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 };//class Std2DMaterialLoader:public Std2DMaterial
}//namespace }//namespace

View File

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

View File

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

View File

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

View File

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

View File

@ -54,15 +54,15 @@ namespace
return true; 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) if(!sd)
return (nullptr); return (nullptr);
for(auto &ua:sd->output) sc->AddOutput(sd->output);
sc->AddOutput(ua.vat,ua.name);
for(auto &s:sd->sampler) for(auto &s:sd->sampler)
mci->AddSampler(ss,DescriptorSetType::PerMaterial,s.type,s.name); mci->AddSampler(ss,DescriptorSetType::PerMaterial,s.type,s.name);
@ -74,18 +74,17 @@ namespace
bool CustomVertexShader(ShaderCreateInfoVertex *vsc) override bool CustomVertexShader(ShaderCreateInfoVertex *vsc) override
{ {
for(auto &ua:mfd->vi) vsc->AddInput(mfd->via);
vsc->AddInput(ua.vat,ua.name);
if(!Std3DMaterial::CustomVertexShader(vsc)) if(!Std3DMaterial::CustomVertexShader(vsc))
return (false); 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 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) if(!sd)
return (false); return (false);
@ -97,7 +96,7 @@ namespace
bool CustomFragmentShader(ShaderCreateInfoFragment *fsc) override 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 }; // class Std3DMaterialLoader:public Std3DMaterial
} // namespace } // namespace

View File

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

View File

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

View File

@ -3,6 +3,23 @@
namespace hgl{namespace graph{ 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) int ShaderCreateInfoFragment::AddOutput(const VAType &type,const AnsiString &name,Interpolation inter)
{ {
VertexInputAttribute via; VertexInputAttribute via;

View File

@ -26,6 +26,21 @@ namespace hgl
AddFunction(mtl::func::MF_HandoverMI_GS); 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) int ShaderCreateInfoGeometry::AddOutput(const SVType &type,const AnsiString &name,Interpolation inter)
{ {
ShaderVariable sv; ShaderVariable sv;

View File

@ -14,9 +14,25 @@ void ShaderCreateInfoVertex::AddMaterialInstanceOutput()
AddFunction(mtl::func::MF_HandoverMI_VS); 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) 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()); 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.input_rate =input_rate;
via.group =group; via.group =group;
via.interpolation =Interpolation::Smooth;
return vsdi.AddInput(via); return vsdi.AddInput(via);
} }
@ -44,6 +62,21 @@ int ShaderCreateInfoVertex::hasInput(const char *name)
return vsdi.hasInput(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) int ShaderCreateInfoVertex::AddOutput(const SVType &type,const AnsiString &name,Interpolation inter)
{ {
ShaderVariable sv; ShaderVariable sv;

View File

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