diff --git a/inc/hgl/graph/mtl/Material3DCreateConfig.h b/inc/hgl/graph/mtl/Material3DCreateConfig.h index fdec6694..0df9f25f 100644 --- a/inc/hgl/graph/mtl/Material3DCreateConfig.h +++ b/inc/hgl/graph/mtl/Material3DCreateConfig.h @@ -9,7 +9,7 @@ enum class LightingModel:uint8 { Unlit, - Gizmo, /// - -STD_MTL_NAMESPACE_BEGIN -namespace -{ - constexpr const char vs_main[]=R"( -void main() -{ - Output.Color=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 MaterialBlinnPhongPureColor3D:public Std3DMaterial - { - public: - - using Std3DMaterial::Std3DMaterial; - ~MaterialBlinnPhongPureColor3D()=default; - - bool CustomVertexShader(ShaderCreateInfoVertex *vsc) override - { - if(!Std3DMaterial::CustomVertexShader(vsc)) - return(false); - - vsc->AddInput(VAT_VEC4,VAN::Color); - - 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); - } - };//class MaterialBlinnPhongPureColor3D:public Std3DMaterial -}//namespace - -MaterialCreateInfo *CreateMaterialBlinnPhongPureColor3D(const Material3DCreateConfig *cfg) -{ - MaterialBlinnPhongPureColor3D mbppc3d(cfg); - - return mbppc3d.Create(); -} -STD_MTL_NAMESPACE_END diff --git a/src/ShaderGen/3d/M_Gizmo3D.cpp b/src/ShaderGen/3d/M_Gizmo3D.cpp new file mode 100644 index 00000000..1ced3ad4 --- /dev/null +++ b/src/ShaderGen/3d/M_Gizmo3D.cpp @@ -0,0 +1,91 @@ +#include"Std3DMaterial.h" +#include + +STD_MTL_NAMESPACE_BEGIN +namespace +{ + // Gizmo3D材质其实就是纯色的blinnphong材质,但不需要外部传入太阳光方向、高光系数等数据。 + // 其全部在Shader中直接包含,它是专门为Gizmo 3D控件所准备的一种材质。 + + constexpr const char mi_codes[]="vec4 Color;"; //材质实例代码 + constexpr const uint32_t mi_bytes=sizeof(Vector4f); //材质实例数据大小 + + constexpr const char vs_main[]=R"( +void main() +{ + HandoverMI(); + + Output.Normal =GetNormal(); + Output.Position =GetPosition3D(); + + gl_Position =Output.Position; +})"; + + //一个shader中输出的所有数据,会被定义在一个名为Output的结构中。所以编写时要用Output.XXXX来使用。 + //而同时,这个结构在下一个Shader中以Input名称出现,使用时以Input.XXX的形式使用。 + + constexpr const char fs_main[]=R"( + +const vec3 SUN_DIRECTION=vec3(0.655386,0.491539,0.573462); //normalized(8,6,7) +const vec3 SUN_COLOR=vec3(1.0,1.0,1.0); + +void main() +{ + MaterialInstance mi=GetMI(); + + //点乘法线和光照 + float intensity=0.5*max(dot(Input.Normal,SUN_DIRECTION),0.0)+0.5; + + //直接光颜色 + vec3 direct_color=intensity*SUN_COLOR*mi.Color.rgb; + + vec3 SpecularColor=vec3(0); + + if(intensity>0.0) + { + vec3 half_vector=normalize(SUN_DIRECTION+normalize(Input.Position.xyz+camera.pos)); + + float specular=max(dot(half_vector,Input.Normal),0.0); + + spec_color=specular*pow(specular,64)*SUN_COLOR; + } + + FragColor=vec4(direct_color+spec_color,1.0); +})"; + + class MaterialGizmo3D:public Std3DMaterial + { + public: + + using Std3DMaterial::Std3DMaterial; + ~MaterialGizmo3D()=default; + + bool CustomVertexShader(ShaderCreateInfoVertex *vsc) override + { + if(!Std3DMaterial::CustomVertexShader(vsc)) + return(false); + + vsc->AddOutput(SVT_VEC4,"Position"); + vsc->AddOutput(SVT_VEC3,"Normal"); + + 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); + } + };//class MaterialGizmo3D:public Std3DMaterial +}//namespace + +MaterialCreateInfo *CreateMaterialGizmo3D(const Material3DCreateConfig *cfg) +{ + MaterialGizmo3D mg3d(cfg); + + return mg3d.Create(); +} +STD_MTL_NAMESPACE_END diff --git a/src/ShaderGen/CMakeLists.txt b/src/ShaderGen/CMakeLists.txt index 41613d67..27c9cd10 100644 --- a/src/ShaderGen/CMakeLists.txt +++ b/src/ShaderGen/CMakeLists.txt @@ -74,7 +74,7 @@ SET(STD_MTL_3D_SOURCE_FILES ${STD_MTL_HEADER_PATH}/Material3DCreateConfig.h 3d/M_BillboardDynamicSize.cpp 3d/M_BillboardFixedSize.cpp 3d/M_Billboard.cpp - 3d/M_BlinnPhongPureColor.cpp + 3d/M_Gizmo3D.cpp ) SET(STD_MTL_SOURCE ${STD_MTL_HEADER_PATH}/MaterialConfig.h