maybe finished, all examples test OK!
This commit is contained in:
parent
2f49e80122
commit
56b8798122
@ -1 +1 @@
|
|||||||
Subproject commit b0955107a7d55ec050cb8cec2378ffbacd228096
|
Subproject commit 3bc0658d28e30457907003d85151b3b46083af53
|
@ -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+=" ";
|
||||||
|
@ -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);
|
||||||
};
|
};
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user