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

95 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 vs_main[]=R"(
void main()
{
gl_Position=GetPosition3D();
gl_Position/=gl_Position.w;
})";
constexpr const char gs_main[]=R"(
void main()
{
const vec2 BillboardVertex[4]=vec2[]
(
vec2(-0.5,-0.5),
vec2(-0.5, 0.5),
vec2( 0.5,-0.5),
vec2( 0.5, 0.5)
);
for(int i=0;i<4;i++)
{
gl_Position=gl_in[0].gl_Position;
gl_Position.xy+=BillboardVertex[i];
Output.TexCoord=BillboardVertex[i]+vec2(0.5);
EmitVertex();
}
EndPrimitive();
})";
constexpr const char fs_main[]=R"(
void main()
{
FragColor=texture(TextureBaseColor,Input.TexCoord);
})";
class MaterialBillboard2DFixedSize:public Std3DMaterial
{
public:
using Std3DMaterial::Std3DMaterial;
~MaterialBillboard2DFixedSize()=default;
bool CustomVertexShader(ShaderCreateInfoVertex *vsc) override
{
if(!Std3DMaterial::CustomVertexShader(vsc))
return(false);
vsc->SetMain(vs_main);
return(true);
}
bool CustomGeometryShader(ShaderCreateInfoGeometry *gsc) override
{
gsc->SetGeom(Prim::Points,Prim::TriangleStrip,4);
gsc->AddOutput(VAT_VEC2,"TexCoord");
gsc->SetMain(gs_main);
return(true);
}
bool CustomFragmentShader(ShaderCreateInfoFragment *fsc) override
{
mci->AddSampler(VK_SHADER_STAGE_FRAGMENT_BIT,DescriptorSetType::PerMaterial,SamplerType::Sampler2D,mtl::SamplerName::BaseColor);
fsc->AddOutput(VAT_VEC4,"FragColor"); //Fragment shader的输出等于最终的RT了所以这个名称其实随便起。
fsc->SetMain(fs_main);
return(true);
}
};//class MaterialBillboard2DFixedSize:public Std3DMaterial
}//namespace
MaterialCreateInfo *CreateBillboard2DFixedSize(mtl::BillboardMaterialCreateConfig *cfg)
{
if(!cfg)
return(nullptr);
cfg->shader_stage_flag_bit|=VK_SHADER_STAGE_GEOMETRY_BIT;
cfg->local_to_world=true;
MaterialBillboard2DFixedSize mtl_billbard_2d_fixed_size(cfg);
return mtl_billbard_2d_fixed_size.Create();
}
STD_MTL_NAMESPACE_END