#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=Luminance*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 MaterialVertexLuminance3D:public Std3DMaterial { public: using Std3DMaterial::Std3DMaterial; ~MaterialVertexLuminance3D()=default; bool CustomVertexShader(ShaderCreateInfoVertex *vsc) override { if(!Std3DMaterial::CustomVertexShader(vsc)) return(false); vsc->AddInput(VAT_FLOAT,VAN::Luminance); vsc->AddOutput(VAT_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 MaterialVertexLuminance3D:public Std3DMaterial }//namespace MaterialCreateInfo *CreateVertexLuminance3D(const Material3DCreateConfig *cfg) { MaterialVertexLuminance3D mvc3d(cfg); return mvc3d.Create(); } STD_MTL_NAMESPACE_END