ULRE/src/ShaderGen/3d/M_VertexLum3D.cpp

78 lines
2.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include"Std3DMaterial.h"
#include<hgl/shadergen/MaterialCreateInfo.h>
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