From 1b201b8831ab85f79f6039bd8111caddc6cb5e58 Mon Sep 17 00:00:00 2001 From: xiangsilian Date: Sat, 20 Sep 2025 21:48:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90mvp=20=E7=9F=A9=E9=98=B5?= =?UTF-8?q?=EF=BC=8C=E5=92=8Cshader?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/texture_loading/texture_loading.cpp | 50 ++++++++++++++----- samples/api/texture_loading/texture_loading.h | 7 +-- 2 files changed, 42 insertions(+), 15 deletions(-) diff --git a/samples/api/texture_loading/texture_loading.cpp b/samples/api/texture_loading/texture_loading.cpp index 53a713c..9abe28c 100644 --- a/samples/api/texture_loading/texture_loading.cpp +++ b/samples/api/texture_loading/texture_loading.cpp @@ -594,6 +594,7 @@ void TextureLoading::draw() { std::unique_lock lock(mtx); std::unique_lock lock_point(mtx_point); + std::unique_lock lock_mvp(mtx_mvp); ApiVulkanSample::prepare_frame(); // --- 新增:在命令缓冲区中绘制点云 --- @@ -901,18 +902,40 @@ void TextureLoading::prepare_uniform_buffers_point() VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU); - update_uniform_buffers_point(); + update_uniform_buffers_point(60, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 2); } -void TextureLoading::update_uniform_buffers_point() -{ - ubo_vs_point.projection = glm::perspective(glm::radians(60.0f), static_cast(width) / static_cast(height), 0.001f, 256.0f); - glm::mat4 view_matrix = glm::translate(glm::mat4(1.0f), camear_pos_point); - ubo_vs_point.model = view_matrix * glm::translate(glm::mat4(1.0f), face_pos_point); - ubo_vs_point.model = glm::rotate(ubo_vs_point.model, glm::radians(rotation.x), glm::vec3(1.0f, 0.0f, 0.0f)); - ubo_vs_point.model = glm::rotate(ubo_vs_point.model, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); - ubo_vs_point.model = glm::rotate(ubo_vs_point.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); +void global_update_mvp(float fov, float x, float y, float z, float sx, float sy, float sz, float rotx, float roty, float rotz, float camx, float camy, float camz) +{ + TextureLoading::Get()->update_uniform_buffers_point(fov, x, y, z, sx, sy, sz, rotx, roty, rotz, camx, camy, camz); +} + +void TextureLoading::update_uniform_buffers_point(float fov, float x, float y, float z, float sx, float sy, float sz, float rotx, float roty, float rotz, float camx, float camy, float camz) +{ + std::unique_lock lock(mtx_mvp); + ubo_vs_point.projection = glm::perspective(glm::radians(fov), static_cast(width) / static_cast(height), 0.001f, 256.0f); + + //glm::vec3 cameraPos = glm::vec3(camx, camy, camz); + //glm::vec3 cameraTarget = glm::vec3(0, 0, 0); + //glm::vec3 cameraUp = glm::vec3(0.0f, 1.0f, 0.0f); + //ubo_vs_point.view = glm::lookAt(cameraPos, cameraTarget, cameraUp); + + ubo_vs_point.view = glm::translate(glm::mat4(1.0f), glm::vec3(camx, camy, camz)); + + glm::mat4 model = glm::mat4(1.0f); // 单位矩阵 + + // 1. 先平移 + model = glm::translate(model, glm::vec3(x, y, z)); + + // 2. 然后旋转(注意顺序:通常Z->Y->X或按需求) + model = glm::rotate(model, glm::radians(rotz), glm::vec3(0.0f, 0.0f, 1.0f)); // Z轴旋转 + model = glm::rotate(model, glm::radians(roty), glm::vec3(0.0f, 1.0f, 0.0f)); // Y轴旋转 + model = glm::rotate(model, glm::radians(rotx), glm::vec3(1.0f, 0.0f, 0.0f)); // X轴旋转 + + // 3. 最后缩放 + model = glm::scale(model, glm::vec3(sx, sy, sz)); + ubo_vs_point.model = model; uniform_buffer_vs_point->convert_and_update(ubo_vs_point); } @@ -1220,11 +1243,15 @@ bool TextureLoading::prepare(const vkb::ApplicationOptions& options) prepare_pipeline_bg(); prepare_pipeline_point(); - float z = 0.1f; + float z = -2.0f; float testPoint[] = { - 1,1,z, 0,0,z, + 0.05,0.05,z, + 0.1,0.1,z, + 0.2,0.2,z, + 0.3,0.3,z, 0.5,0.5,z, + 1,1,z, }; int pointCount = sizeof(testPoint) / (3*4); update_point_vertex_buffer(testPoint, pointCount); @@ -1281,7 +1308,6 @@ void TextureLoading::render(float delta_time) void TextureLoading::view_changed() { update_uniform_buffers(); - update_uniform_buffers_point(); } void TextureLoading::on_update_ui_overlay(vkb::Drawer& drawer) diff --git a/samples/api/texture_loading/texture_loading.h b/samples/api/texture_loading/texture_loading.h index 1e2e483..8a49058 100644 --- a/samples/api/texture_loading/texture_loading.h +++ b/samples/api/texture_loading/texture_loading.h @@ -84,8 +84,8 @@ public: std::unique_ptr uniform_buffer_vs_point; - glm::vec3 camear_pos_point = {0, 0, -2.f}; - glm::vec3 face_pos_point; + //glm::vec3 camear_pos_point = {0, 0, -2.f}; + //glm::vec3 face_pos_point; struct { @@ -139,7 +139,7 @@ public: void update_uniform_buffers(); void prepare_uniform_buffers_point(); - void update_uniform_buffers_point(); + void update_uniform_buffers_point(float fov, float x, float y, float z, float sx, float sy, float sz, float rotx, float roty, float rotz, float camx, float camy, float camz); void prepare_pipelines(); @@ -172,6 +172,7 @@ public: //void start(); std::mutex mtx; std::mutex mtx_point; + std::mutex mtx_mvp; //void stop(); //void updateTexture(); };