From 45f50b3bc0e43f7a9bd0603628219a8998855275 Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Thu, 28 Sep 2023 17:41:45 +0800 Subject: [PATCH] added GetPosition3DCamera/GetPosition3DL2WCamera and to support UBO Camera --- example/common/VulkanAppFramework.h | 15 ++++++--------- inc/hgl/graph/mtl/3d/Material3DCreateConfig.h | 3 +++ src/ShaderGen/3d/Std3DMaterial.cpp | 13 +++++++++++-- src/ShaderGen/common/MFGetPosition.h | 14 ++++++++++++++ 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/example/common/VulkanAppFramework.h b/example/common/VulkanAppFramework.h index 1f04a591..3f161407 100644 --- a/example/common/VulkanAppFramework.h +++ b/example/common/VulkanAppFramework.h @@ -472,6 +472,10 @@ public: virtual void InitCamera(int w,int h) { + camera=new Camera; + + camera->pos=Vector3f(10,10,10); + camera_control=new FirstPersonCameraControl(&vp_info,camera); camera_control->Refresh(); //更新矩阵计算 @@ -482,13 +486,11 @@ public: win->Join(ckc); win->Join(cmc); - camera=new Camera; - - camera->pos=Vector3f(10,10,10); - RefreshCameraInfo(&camera_control->GetCameraInfo(),&vp_info,camera); ubo_camera_info=db->CreateUBO(sizeof(CameraInfo),&camera_control->GetCameraInfo()); + + db->global_descriptor.AddUBO(mtl::SBS_CameraInfo.name,ubo_camera_info); } void Resize(int w,int h)override @@ -510,11 +512,6 @@ public: return ubo_camera_info; } - bool BindCameraUBO(Material *mtl) - { - return mtl->BindUBO(DescriptorSetType::Global,"g_camera",ubo_camera_info); - } - virtual void BuildCommandBuffer(uint32_t index)=0; virtual void Draw()override diff --git a/inc/hgl/graph/mtl/3d/Material3DCreateConfig.h b/inc/hgl/graph/mtl/3d/Material3DCreateConfig.h index fce19ae0..f3c542d2 100644 --- a/inc/hgl/graph/mtl/3d/Material3DCreateConfig.h +++ b/inc/hgl/graph/mtl/3d/Material3DCreateConfig.h @@ -7,6 +7,8 @@ STD_MTL_NAMESPACE_BEGIN struct Material3DCreateConfig:public MaterialCreateConfig { + bool camera; ///<包含摄像机矩阵信息 + bool local_to_world; ///<包含LocalToWorld矩阵 VAT position_format; ///AddInput(cfg->position_format,VAN::Position); + if(cfg->camera) + { + mci->AddStruct(SBS_CameraInfo); + + mci->AddUBO(VK_SHADER_STAGE_ALL_GRAPHICS, + DescriptorSetType::Global, + SBS_CameraInfo); + } + if(cfg->local_to_world) { mci->SetLocalToWorld(VK_SHADER_STAGE_ALL_GRAPHICS); vsc->AddAssign(); - vsc->AddFunction(func::GetPosition3DL2W); + vsc->AddFunction(cfg->camera?func::GetPosition3DL2WCamera:func::GetPosition3DL2W); } else - vsc->AddFunction(func::GetPosition3D); + vsc->AddFunction(cfg->camera?func::GetPosition3DCamera:func::GetPosition3D); mci->AddUBO(VK_SHADER_STAGE_VERTEX_BIT, DescriptorSetType::Global, diff --git a/src/ShaderGen/common/MFGetPosition.h b/src/ShaderGen/common/MFGetPosition.h index 066d4f7b..55cbb5f6 100644 --- a/src/ShaderGen/common/MFGetPosition.h +++ b/src/ShaderGen/common/MFGetPosition.h @@ -66,5 +66,19 @@ vec4 GetPosition3D() return GetLocalToWorld()*vec4(Position,1); } )"; + +constexpr const char *GetPosition3DCamera=R"( +vec4 GetPosition3D() +{ + return camera.vp*vec4(Position,1); +} +)"; + + constexpr const char *GetPosition3DL2WCamera=R"( +vec4 GetPosition3D() +{ + return camera.vp*GetLocalToWorld()*vec4(Position,1); +} +)"; }//namespace func STD_MTL_NAMESPACE_END