diff --git a/projects/mesh_shader/resources/shaders/shader.mesh b/projects/mesh_shader/resources/shaders/shader.mesh index fc1480bc3f42f02e2e04afe5ab48c715a1859ade..a120e432441a6f367772ded537a89c1f4b92a414 100644 --- a/projects/mesh_shader/resources/shaders/shader.mesh +++ b/projects/mesh_shader/resources/shaders/shader.mesh @@ -2,10 +2,10 @@ #extension GL_ARB_separate_shader_objects : enable #extension GL_NV_mesh_shader : require -layout(local_size_x=32) in; +layout(local_size_x=30) in; layout(triangles) out; -layout(max_vertices=64, max_primitives=126) out; +layout(max_vertices=30, max_primitives=10) out; layout( push_constant ) uniform constants{ mat4 mvp; @@ -15,8 +15,8 @@ layout(location = 0) out vec3 passNormal[]; struct Vertex { - vec3 position; - vec3 normal; + vec3 position; float padding0; + vec3 normal; float padding1; }; layout(std430, binding = 0) readonly buffer vertexBuffer @@ -29,20 +29,26 @@ layout(std430, binding = 1) readonly buffer indexBuffer uint indices[]; // breaks for 16 bit indices }; +taskNV in Task { + uint baseID; +} IN; + void main() { - if(gl_LocalInvocationID.x == 0) - { - gl_PrimitiveCountNV = 1; - gl_PrimitiveIndicesNV[0] = 0; - gl_PrimitiveIndicesNV[1] = 1; - gl_PrimitiveIndicesNV[2] = 2; - - gl_MeshVerticesNV[0].gl_Position = mvp * vec4(-0.5, 0.5, 0.5, 1); - gl_MeshVerticesNV[1].gl_Position = mvp * vec4( 0.5, 0.5, 0.5, 1); - gl_MeshVerticesNV[2].gl_Position = mvp * vec4( 0 , -0.5, 0.5, 1); - - passNormal[0] = vec3(1, 0, 0); - passNormal[1] = vec3(0, 1, 0); - passNormal[2] = vec3(0, 0, 1); - } + + uint workIndex = gl_LocalInvocationID.x; + gl_PrimitiveIndicesNV[workIndex] = workIndex; + + const uint verticesPerMeshTask = 30; + uint previousMeshGroupCount = IN.baseID; + uint indexBufferIndex = previousMeshGroupCount * verticesPerMeshTask + workIndex; + uint index = indices[indexBufferIndex]; + + vec3 inPos = vertices[index].position; + vec3 inNormal = vertices[index].normal; + gl_MeshVerticesNV[workIndex].gl_Position = mvp * vec4(inPos, 1); + passNormal[workIndex] = inNormal; + + if(gl_LocalInvocationID.x == 0){ + gl_PrimitiveCountNV = 10; + } } \ No newline at end of file diff --git a/projects/mesh_shader/resources/shaders/shader.task b/projects/mesh_shader/resources/shaders/shader.task index a41b6d21c312d966b55ba33ffe402502f6882e79..c2c143a8130da4d52567d1bee28e82ea480e5939 100644 --- a/projects/mesh_shader/resources/shaders/shader.task +++ b/projects/mesh_shader/resources/shaders/shader.task @@ -2,16 +2,17 @@ #extension GL_ARB_separate_shader_objects : enable #extension GL_NV_mesh_shader : require -layout(local_size_x=32) in; +layout(local_size_x=1) in; -//taskNV out Task { -// uint baseID; -// uint subIDs[32]; -//} OUT; +taskNV out Task { + uint baseID; +} OUT; + +layout( push_constant ) uniform constants{ + mat4 mvp; +}; void main() { - if(gl_LocalInvocationID.x == 0) - { - gl_TaskCountNV = 1; - } + gl_TaskCountNV = 1; + OUT.baseID = gl_GlobalInvocationID.x; } \ No newline at end of file diff --git a/projects/mesh_shader/src/main.cpp b/projects/mesh_shader/src/main.cpp index 03e4b68e7ffd52f98dd12059ebe8ca80e9bb845f..740ffae2b98008864796f8bd7b192ebcfa185c0f 100644 --- a/projects/mesh_shader/src/main.cpp +++ b/projects/mesh_shader/src/main.cpp @@ -10,8 +10,10 @@ #include "MeshStruct.hpp" struct Vertex { - glm::vec3 position; - glm::vec3 normal; + glm::vec3 position; + float padding0; + glm::vec3 normal; + float padding1; }; std::vector<Vertex> convertToVertices( @@ -254,26 +256,28 @@ int main(int argc, const char** argv) { glm::mat4 modelMatrix = *reinterpret_cast<glm::mat4*>(&mesh.meshes.front().modelMatrix); glm::mat4 mvp = cameraManager.getActiveCamera().getMVP() * modelMatrix; - vkcv::PushConstantData pushConstantData((void*)&mvp, sizeof(glm::mat4)); - const std::vector<vkcv::ImageHandle> renderTargets = { swapchainInput, depthBuffer }; auto cmdStream = core.createCommandStream(vkcv::QueueType::Graphics); const bool useMeshShader = true; + vkcv::PushConstantData pushConstantData((void*)&mvp, sizeof(glm::mat4)); + if (useMeshShader) { vkcv::DescriptorSetUsage descriptorUsage(0, core.getDescriptorSet(meshShaderDescriptorSet).vulkanHandle); + const uint32_t verticesPerTask = 30; core.recordMeshShaderDrawcalls( cmdStream, renderPass, meshShaderPipeline, pushConstantData, - { vkcv::MeshShaderDrawcall({descriptorUsage}, 1) }, + { vkcv::MeshShaderDrawcall({descriptorUsage}, glm::ceil(bunny.numIndices / float(verticesPerTask))) }, { renderTargets }); } else { + core.recordDrawcallsToCmdStream( cmdStream, renderPass,