diff --git a/CMSceneGraph b/CMSceneGraph index d218c743..deb54cde 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit d218c7435039d1932f6d79f3894ba1b74b22f4fe +Subproject commit deb54cdeaf5889d95e37524c00317c6274f3e2f7 diff --git a/example/Basic/Billboard2D.cpp b/example/Basic/Billboard2D.cpp deleted file mode 100644 index 05277873..00000000 --- a/example/Basic/Billboard2D.cpp +++ /dev/null @@ -1,131 +0,0 @@ -// Billboard2D -// 用于实现在3D场景中显示固定象素尺寸的2D内容,比如显示在3D场景中的血条、头顶名字等。 - -#include"VulkanAppFramework.h" -#include -#include -#include -#include -#include -#include - -using namespace hgl; -using namespace hgl::graph; - -class TestApp:public SceneAppFramework -{ -private: - - Material * material =nullptr; - Pipeline * pipeline =nullptr; - - Primitive * prim_plane_grid =nullptr; - MaterialInstance * material_instance[3]{}; - -private: - - bool InitMDP() - { - mtl::Material3DCreateConfig cfg(device->GetDeviceAttribute(),"VertexLuminance3D",Prim::Lines); - - cfg.local_to_world=true; - cfg.position_format=VAT_VEC2; - - material=db->LoadMaterial("Std3D/VertexLum3D",&cfg); - if(!material)return(false); - - Color4f GridColor; - COLOR ce=COLOR::BlenderAxisRed; - - for(uint i=0;i<3;i++) - { - GridColor=GetColor4f(ce,1.0); - - material_instance[i]=db->CreateMaterialInstance(material,nullptr,&GridColor); - - ce=COLOR((int)ce+1); - } - - pipeline=CreatePipeline(material,InlinePipeline::Solid3D,Prim::Lines); - - return pipeline; - } - - bool CreateRenderObject() - { - using namespace inline_geometry; - - struct PlaneGridCreateInfo pgci; - - pgci.grid_size.Set(32,32); - pgci.sub_count.Set(8,8); - - pgci.lum=0.75; - pgci.sub_lum=1.0; - - PrimitiveCreater pc(device,material->GetDefaultVIL()); - - prim_plane_grid=CreatePlaneGrid(&pc,&pgci); - - return prim_plane_grid; - } - - Renderable *Add(MaterialInstance *mi,const Matrix4f &mat) - { - Renderable *ri=db->CreateRenderable(prim_plane_grid,mi,pipeline); - - if(!ri) - return(nullptr); - - render_root.CreateSubNode(mat,ri); - - return ri; - } - - bool InitScene() - { - Add(material_instance[0],Matrix4f(1.0f)); - Add(material_instance[1],rotate(HGL_RAD_90,0,1,0)); - Add(material_instance[2],rotate(HGL_RAD_90,1,0,0)); - - camera->pos=Vector3f(32,32,32); - camera_control->SetTarget(Vector3f(0,0,0)); - camera_control->Refresh(); - -// camera_control->SetReserveDirection(true,true); //反转x,y - - render_root.RefreshMatrix(); - render_list->Expend(&render_root); - - return(true); - } - -public: - - ~TestApp() - { - SAFE_CLEAR(prim_plane_grid); - } - - bool Init(uint width,uint height) override - { - if(!SceneAppFramework::Init(width,height)) - return(false); - - if(!InitMDP()) - return(false); - - if(!CreateRenderObject()) - return(false); - - if(!InitScene()) - return(false); - - return(true); - } -};//class TestApp:public CameraAppFramework - -int main(int,char **) -{ - return RunApp(1280,720); -} diff --git a/example/Basic/Billboard2DWay.cpp b/example/Basic/BillboardTest.cpp similarity index 95% rename from example/Basic/Billboard2DWay.cpp rename to example/Basic/BillboardTest.cpp index dc42994d..7f2e82df 100644 --- a/example/Basic/Billboard2DWay.cpp +++ b/example/Basic/BillboardTest.cpp @@ -1,4 +1,4 @@ -// Billboard : The 2D way +// Billboard #include"VulkanAppFramework.h" #include @@ -70,15 +70,17 @@ private: bool InitBillboardMP() { - mtl::Material3DCreateConfig cfg(device->GetDeviceAttribute(),"Billboard2DWay",Prim::Billboard2DWay); + mtl::BillboardMaterialCreateConfig cfg(device->GetDeviceAttribute(),"Billboard2D",Prim::Billboard); { - AutoDelete mci=mtl::CreateBillboard2DWay(&cfg); + cfg.fixed_size=false; + + AutoDelete mci=mtl::CreateBillboard2D(&cfg); mi_billboard=db->CreateMaterialInstance(mci); if(!mi_billboard)return(false); - pipeline_billboard=CreatePipeline(mi_billboard,InlinePipeline::Solid3D,Prim::Billboard2DWay); + pipeline_billboard=CreatePipeline(mi_billboard,InlinePipeline::Solid3D,Prim::Billboard); if(!pipeline_billboard)return(false); } diff --git a/example/Basic/CMakeLists.txt b/example/Basic/CMakeLists.txt index f5a98ca4..f262ce0f 100644 --- a/example/Basic/CMakeLists.txt +++ b/example/Basic/CMakeLists.txt @@ -15,4 +15,4 @@ CreateProject(02_draw_triangle_use_UBO draw_triangle_use_UBO.cpp) CreateProject(03_auto_instance auto_instance.cpp) CreateProject(04_auto_merge_material_instance auto_merge_material_instance.cpp) -CreateProject(05_Billboard2DWay Billboard2DWay.cpp) \ No newline at end of file +CreateProject(05_Billboard BillboardTest.cpp) \ No newline at end of file diff --git a/inc/hgl/graph/mtl/Material3DCreateConfig.h b/inc/hgl/graph/mtl/Material3DCreateConfig.h index e001f200..37bf8213 100644 --- a/inc/hgl/graph/mtl/Material3DCreateConfig.h +++ b/inc/hgl/graph/mtl/Material3DCreateConfig.h @@ -53,7 +53,19 @@ public: MaterialCreateInfo *CreateVertexColor3D(const Material3DCreateConfig *); MaterialCreateInfo *CreateVertexLuminance3D(const Material3DCreateConfig *); -MaterialCreateInfo *CreateBillboard2DWay(mtl::Material3DCreateConfig *); + +struct BillboardMaterialCreateConfig:public Material3DCreateConfig +{ + bool fixed_size; ///<固定大小(指像素尺寸) + + Vector2u pixel_size; ///<像素尺寸 + +public: + + using Material3DCreateConfig::Material3DCreateConfig; +}; + +MaterialCreateInfo *CreateBillboard2D(mtl::BillboardMaterialCreateConfig *); /** * 从文件加载材质 diff --git a/src/ShaderGen/3d/M_Billboard.cpp b/src/ShaderGen/3d/M_Billboard.cpp new file mode 100644 index 00000000..27271892 --- /dev/null +++ b/src/ShaderGen/3d/M_Billboard.cpp @@ -0,0 +1,16 @@ +#include"Std3DMaterial.h" + +STD_MTL_NAMESPACE_BEGIN + +MaterialCreateInfo *CreateBillboard2DDynamic(mtl::BillboardMaterialCreateConfig *cfg); +MaterialCreateInfo *CreateBillboard2DFixedSize(mtl::BillboardMaterialCreateConfig *cfg); + +MaterialCreateInfo *CreateBillboard2D(mtl::BillboardMaterialCreateConfig *cfg) +{ + if(cfg->fixed_size) + return CreateBillboard2DFixedSize(cfg); + else + return CreateBillboard2DDynamic(cfg); +} + +STD_MTL_NAMESPACE_END \ No newline at end of file diff --git a/src/ShaderGen/3d/M_Billboard2DWay.cpp b/src/ShaderGen/3d/M_BillboardDynamicSize.cpp similarity index 86% rename from src/ShaderGen/3d/M_Billboard2DWay.cpp rename to src/ShaderGen/3d/M_BillboardDynamicSize.cpp index cb97b225..28ef8b0b 100644 --- a/src/ShaderGen/3d/M_Billboard2DWay.cpp +++ b/src/ShaderGen/3d/M_BillboardDynamicSize.cpp @@ -45,12 +45,12 @@ void main() FragColor=texture(TextureBaseColor,Input.TexCoord); })"; - class MaterialBillboard2DWay:public Std3DMaterial + class MaterialBillboard2DDynamicSize:public Std3DMaterial { public: using Std3DMaterial::Std3DMaterial; - ~MaterialBillboard2DWay()=default; + ~MaterialBillboard2DDynamicSize()=default; bool CustomVertexShader(ShaderCreateInfoVertex *vsc) override { @@ -82,10 +82,10 @@ void main() fsc->SetMain(fs_main); return(true); } - };//class MaterialBillboard2DWay:public Std3DMaterial + };//class MaterialBillboard2DDynamicSize:public Std3DMaterial }//namespace -MaterialCreateInfo *CreateBillboard2DWay(mtl::Material3DCreateConfig *cfg) +MaterialCreateInfo *CreateBillboard2DDynamic(mtl::BillboardMaterialCreateConfig *cfg) { if(!cfg) return(nullptr); @@ -94,8 +94,8 @@ MaterialCreateInfo *CreateBillboard2DWay(mtl::Material3DCreateConfig *cfg) cfg->local_to_world=true; - MaterialBillboard2DWay mtl_billbard_2dway(cfg); + MaterialBillboard2DDynamicSize mtl_billbard_2d(cfg); - return mtl_billbard_2dway.Create(); + return mtl_billbard_2d.Create(); } STD_MTL_NAMESPACE_END diff --git a/src/ShaderGen/3d/M_BillboardFixedSize.cpp b/src/ShaderGen/3d/M_BillboardFixedSize.cpp new file mode 100644 index 00000000..c0742c55 --- /dev/null +++ b/src/ShaderGen/3d/M_BillboardFixedSize.cpp @@ -0,0 +1,94 @@ +#include"Std3DMaterial.h" +#include + +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 diff --git a/src/ShaderGen/CMakeLists.txt b/src/ShaderGen/CMakeLists.txt index d0e27ea2..906a02f7 100644 --- a/src/ShaderGen/CMakeLists.txt +++ b/src/ShaderGen/CMakeLists.txt @@ -69,7 +69,9 @@ SET(STD_MTL_3D_SOURCE_FILES ${STD_MTL_HEADER_PATH}/Material3DCreateConfig.h 3d/Std3DMaterialLoader.cpp 3d/M_VertexColor3D.cpp 3d/M_VertexLum3D.cpp - 3d/M_Billboard2DWay.cpp + 3d/M_BillboardDynamicSize.cpp + 3d/M_BillboardFixedSize.cpp + 3d/M_Billboard.cpp ) SET(STD_MTL_SOURCE ${STD_MTL_HEADER_PATH}/MaterialConfig.h