From 9478ce490a58cb53684c5f3c380cf4f1e557cf77 Mon Sep 17 00:00:00 2001 From: Alexander Gauggel <agauggel@uni-koblenz.de> Date: Tue, 20 Jul 2021 15:46:55 +0200 Subject: [PATCH] [#87] Compute bounding sphere per meshlet --- .../meshlet/include/vkcv/meshlet/Meshlet.hpp | 10 ++++++---- modules/meshlet/src/vkcv/meshlet/Meshlet.cpp | 18 ++++++++++++++++++ .../mesh_shader/resources/shaders/shader.mesh | 10 ++++++---- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/modules/meshlet/include/vkcv/meshlet/Meshlet.hpp b/modules/meshlet/include/vkcv/meshlet/Meshlet.hpp index 498257c1..159bdb1a 100644 --- a/modules/meshlet/include/vkcv/meshlet/Meshlet.hpp +++ b/modules/meshlet/include/vkcv/meshlet/Meshlet.hpp @@ -15,10 +15,12 @@ namespace vkcv::meshlet { }; struct Meshlet { - uint32_t vertexOffset; - uint32_t vertexCount; - uint32_t indexOffset; - uint32_t indexCount; + uint32_t vertexOffset; + uint32_t vertexCount; + uint32_t indexOffset; + uint32_t indexCount; + glm::vec3 meanPosition; + float boundingSphereRadius; }; struct MeshShaderModelData { diff --git a/modules/meshlet/src/vkcv/meshlet/Meshlet.cpp b/modules/meshlet/src/vkcv/meshlet/Meshlet.cpp index 02bfa9d8..f5447a01 100644 --- a/modules/meshlet/src/vkcv/meshlet/Meshlet.cpp +++ b/modules/meshlet/src/vkcv/meshlet/Meshlet.cpp @@ -110,6 +110,24 @@ MeshShaderModelData createMeshShaderModelData( data.vertices.push_back(v); } + // compute mean position + meshlet.meanPosition = glm::vec3(0); + const uint32_t meshletLastVertexIndex = meshlet.vertexOffset + meshlet.vertexCount; + + for (uint32_t vertexIndex = meshlet.vertexOffset; vertexIndex < meshletLastVertexIndex; vertexIndex++) { + const Vertex& v = data.vertices[vertexIndex]; + meshlet.meanPosition += v.position; + } + meshlet.meanPosition /= meshlet.vertexCount; + + // compute bounding sphere radius + meshlet.boundingSphereRadius = 0.f; + for (uint32_t vertexIndex = meshlet.vertexOffset; vertexIndex < meshletLastVertexIndex; vertexIndex++) { + const Vertex& v = data.vertices[vertexIndex]; + const float d = glm::distance(v.position, meshlet.meanPosition); + meshlet.boundingSphereRadius = glm::max(meshlet.boundingSphereRadius, d); + } + data.meshlets.push_back(meshlet); } diff --git a/projects/mesh_shader/resources/shaders/shader.mesh b/projects/mesh_shader/resources/shaders/shader.mesh index 628d9841..97e73cbd 100644 --- a/projects/mesh_shader/resources/shaders/shader.mesh +++ b/projects/mesh_shader/resources/shaders/shader.mesh @@ -31,10 +31,12 @@ layout(std430, binding = 1) readonly buffer indexBuffer }; struct Meshlet{ - uint vertexOffset; - uint vertexCount; - uint indexOffset; - uint indexCount; + uint vertexOffset; + uint vertexCount; + uint indexOffset; + uint indexCount; + vec3 meanPosition; + float boundingSphereRadius; }; layout(std430, binding = 2) readonly buffer meshletBuffer -- GitLab