diff --git a/inc/hgl/graph/mtl/Material3DCreateConfig.h b/inc/hgl/graph/mtl/Material3DCreateConfig.h index 97aed9bd..81abc849 100644 --- a/inc/hgl/graph/mtl/Material3DCreateConfig.h +++ b/inc/hgl/graph/mtl/Material3DCreateConfig.h @@ -25,7 +25,7 @@ public: :MaterialCreateConfig(p) { rt_output.color=1; //输出一个颜色 - rt_output.depth=true; //不输出深度 + rt_output.depth=true; //输出深度 rt_output.stencil=false; //不输出stencil camera=(wc==WithCamera::With); @@ -56,6 +56,7 @@ public: const AnsiString ToHashString() override; };//struct Material3DCreateConfig:public MaterialCreateConfig +DEFINE_MATERIAL_FACTORY_CLASS(PureColor3D, const Material3DCreateConfig); DEFINE_MATERIAL_FACTORY_CLASS(VertexColor3D, const Material3DCreateConfig); DEFINE_MATERIAL_FACTORY_CLASS(VertexLuminance3D,const Material3DCreateConfig); DEFINE_MATERIAL_FACTORY_CLASS(Gizmo3D, const Material3DCreateConfig); diff --git a/src/ShaderGen/3d/M_PureColor3D.cpp b/src/ShaderGen/3d/M_PureColor3D.cpp new file mode 100644 index 00000000..63657569 --- /dev/null +++ b/src/ShaderGen/3d/M_PureColor3D.cpp @@ -0,0 +1,75 @@ +#include"Std3DMaterial.h" +#include + +STD_MTL_NAMESPACE_BEGIN +namespace +{ + constexpr const char mi_codes[]="vec4 Color;"; //材质实例代码 + constexpr const uint32_t mi_bytes=sizeof(Vector4f); //材质实例数据大小 + + constexpr const char vs_main[]=R"( +void main() +{ + MaterialInstance mi=GetMI(); + + Output.Color=mi.Color; + + gl_Position=GetPosition3D(); +})"; + + //一个shader中输出的所有数据,会被定义在一个名为Output的结构中。所以编写时要用Output.XXXX来使用。 + //而同时,这个结构在下一个Shader中以Input名称出现,使用时以Input.XXX的形式使用。 + + constexpr const char fs_main[]=R"( +void main() +{ + FragColor=Input.Color; +})";// ^ ^ + // | | + // | +--ps:这里的Input.Color就是上一个Shader中的Output.Color + // +--ps:这里的Color就是最终的RT + + class MaterialPureColor3D:public Std3DMaterial + { + public: + + using Std3DMaterial::Std3DMaterial; + ~MaterialPureColor3D()=default; + + bool CustomVertexShader(ShaderCreateInfoVertex *vsc) override + { + if(!Std3DMaterial::CustomVertexShader(vsc)) + return(false); + + vsc->AddOutput(SVT_VEC4,"Color"); + + vsc->SetMain(vs_main); + return(true); + } + + bool CustomFragmentShader(ShaderCreateInfoFragment *fsc) override + { + fsc->AddOutput(VAT_VEC4,"FragColor"); //Fragment shader的输出等于最终的RT了,所以这个名称其实随便起。 + + fsc->SetMain(fs_main); + return(true); + } + + bool EndCustomShader() override + { + mci->SetMaterialInstance( mi_codes, //材质实例glsl代码 + mi_bytes, //材质实例数据大小 + VK_SHADER_STAGE_VERTEX_BIT); //只在Vertex Shader中使用材质实例最终数据 + + return(true); + } + };//class MaterialPureColor3D:public Std3DMaterial +}//namespace + +MaterialCreateInfo *CreatePureColor3D(const VulkanDevAttr *dev_attr,const Material3DCreateConfig *cfg) +{ + MaterialPureColor3D mvc3d(cfg); + + return mvc3d.Create(dev_attr); +} +STD_MTL_NAMESPACE_END diff --git a/src/ShaderGen/CMakeLists.txt b/src/ShaderGen/CMakeLists.txt index 027302d6..15152472 100644 --- a/src/ShaderGen/CMakeLists.txt +++ b/src/ShaderGen/CMakeLists.txt @@ -68,6 +68,7 @@ SET(STD_MTL_3D_SOURCE_FILES ${STD_MTL_HEADER_PATH}/Material3DCreateConfig.h 3d/Std3DMaterial.h 3d/Std3DMaterial.cpp 3d/Std3DMaterialLoader.cpp + 3d/M_PureColor3D.cpp 3d/M_VertexColor3D.cpp 3d/M_VertexLum3D.cpp 3d/M_BillboardDynamicSize.cpp