From 90a4f1d49fbc3b96b85931812ba2deabeead94a7 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Tue, 18 Jun 2024 13:08:59 +0800 Subject: [PATCH] finished BillboardFixedSize. next step is use ShaderVariable --- example/Basic/BillboardTest.cpp | 8 +++++--- src/ShaderGen/3d/M_BillboardFixedSize.cpp | 20 +++++++++++++++++++- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/example/Basic/BillboardTest.cpp b/example/Basic/BillboardTest.cpp index 7f2e82df..b69b3215 100644 --- a/example/Basic/BillboardTest.cpp +++ b/example/Basic/BillboardTest.cpp @@ -28,8 +28,6 @@ class TestApp:public SceneAppFramework { Color4f color; - DeviceBuffer *ubo_color=nullptr; - private: Material * mtl_plane_grid =nullptr; @@ -73,7 +71,7 @@ private: mtl::BillboardMaterialCreateConfig cfg(device->GetDeviceAttribute(),"Billboard2D",Prim::Billboard); { - cfg.fixed_size=false; + cfg.fixed_size=true; AutoDelete mci=mtl::CreateBillboard2D(&cfg); @@ -100,6 +98,10 @@ private: sampler)) ///<采样器 return(false); + Vector2u texture_size(texture->GetWidth(),texture->GetHeight()); + + mi_billboard->WriteMIData(texture_size); + return(true); } diff --git a/src/ShaderGen/3d/M_BillboardFixedSize.cpp b/src/ShaderGen/3d/M_BillboardFixedSize.cpp index c0742c55..ec43ebed 100644 --- a/src/ShaderGen/3d/M_BillboardFixedSize.cpp +++ b/src/ShaderGen/3d/M_BillboardFixedSize.cpp @@ -4,9 +4,16 @@ STD_MTL_NAMESPACE_BEGIN namespace { + constexpr const char mi_codes[]="uvec2 BillboardSize;"; //材质实例代码 + constexpr const uint32_t mi_bytes=sizeof(Vector2u); //材质实例数据大小 + constexpr const char vs_main[]=R"( void main() { + MaterialInstance mi=GetMI(); + + Output.BillboardSize=mi.BillboardSize/viewport.canvas_resolution; + gl_Position=GetPosition3D(); gl_Position/=gl_Position.w; })"; @@ -25,7 +32,7 @@ void main() for(int i=0;i<4;i++) { gl_Position=gl_in[0].gl_Position; - gl_Position.xy+=BillboardVertex[i]; + gl_Position.xy+=BillboardVertex[i]*Input[0].BillboardSize; Output.TexCoord=BillboardVertex[i]+vec2(0.5); @@ -52,6 +59,8 @@ void main() if(!Std3DMaterial::CustomVertexShader(vsc)) return(false); + vsc->AddOutput(VAT_VEC2,"BillboardSize"); + vsc->SetMain(vs_main); return(true); } @@ -75,6 +84,15 @@ void main() 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 MaterialBillboard2DFixedSize:public Std3DMaterial }//namespace