finished BillboardFixedSize. next step is use ShaderVariable

This commit is contained in:
hyzboy 2024-06-18 13:08:59 +08:00
parent 3927b3c788
commit 90a4f1d49f
2 changed files with 24 additions and 4 deletions

View File

@ -28,8 +28,6 @@ class TestApp:public SceneAppFramework
{ {
Color4f color; Color4f color;
DeviceBuffer *ubo_color=nullptr;
private: private:
Material * mtl_plane_grid =nullptr; Material * mtl_plane_grid =nullptr;
@ -73,7 +71,7 @@ private:
mtl::BillboardMaterialCreateConfig cfg(device->GetDeviceAttribute(),"Billboard2D",Prim::Billboard); mtl::BillboardMaterialCreateConfig cfg(device->GetDeviceAttribute(),"Billboard2D",Prim::Billboard);
{ {
cfg.fixed_size=false; cfg.fixed_size=true;
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreateBillboard2D(&cfg); AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreateBillboard2D(&cfg);
@ -100,6 +98,10 @@ private:
sampler)) ///<采样器 sampler)) ///<采样器
return(false); return(false);
Vector2u texture_size(texture->GetWidth(),texture->GetHeight());
mi_billboard->WriteMIData(texture_size);
return(true); return(true);
} }

View File

@ -4,9 +4,16 @@
STD_MTL_NAMESPACE_BEGIN STD_MTL_NAMESPACE_BEGIN
namespace namespace
{ {
constexpr const char mi_codes[]="uvec2 BillboardSize;"; //材质实例代码
constexpr const uint32_t mi_bytes=sizeof(Vector2u); //材质实例数据大小
constexpr const char vs_main[]=R"( constexpr const char vs_main[]=R"(
void main() void main()
{ {
MaterialInstance mi=GetMI();
Output.BillboardSize=mi.BillboardSize/viewport.canvas_resolution;
gl_Position=GetPosition3D(); gl_Position=GetPosition3D();
gl_Position/=gl_Position.w; gl_Position/=gl_Position.w;
})"; })";
@ -25,7 +32,7 @@ void main()
for(int i=0;i<4;i++) for(int i=0;i<4;i++)
{ {
gl_Position=gl_in[0].gl_Position; 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); Output.TexCoord=BillboardVertex[i]+vec2(0.5);
@ -52,6 +59,8 @@ void main()
if(!Std3DMaterial::CustomVertexShader(vsc)) if(!Std3DMaterial::CustomVertexShader(vsc))
return(false); return(false);
vsc->AddOutput(VAT_VEC2,"BillboardSize");
vsc->SetMain(vs_main); vsc->SetMain(vs_main);
return(true); return(true);
} }
@ -75,6 +84,15 @@ void main()
fsc->SetMain(fs_main); fsc->SetMain(fs_main);
return(true); 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 };//class MaterialBillboard2DFixedSize:public Std3DMaterial
}//namespace }//namespace