diff --git a/modules/meshlet/include/vkcv/meshlet/Meshlet.hpp b/modules/meshlet/include/vkcv/meshlet/Meshlet.hpp index 498257c15c9292adcc9cf5aa342422185077c00b..159bdb1a362fd206201a277376d0df09c508900b 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 02bfa9d80ff54f2f6d1cb3a9f450c43366595bb2..f5447a0100cc92875a2db2161ed9333e4261a992 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 628d98416a1b0ea57788019c3510107d98ed731f..97e73cbddb3ed222ef44b72ba4275ffa1c58ff6d 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