From ed406e61a69a9fb5616e087c99291eb27ba2b9a9 Mon Sep 17 00:00:00 2001 From: Sascha Willems Date: Thu, 10 Nov 2022 18:24:57 +0100 Subject: [PATCH] Added simple task shader --- data/shaders/glsl/meshshader/meshshader.mesh | 28 ++++++++++++++---- .../glsl/meshshader/meshshader.mesh.spv | Bin 2460 -> 3016 bytes data/shaders/glsl/meshshader/meshshader.task | 13 ++++++++ .../glsl/meshshader/meshshader.task.spv | Bin 0 -> 300 bytes examples/meshshader/meshshader.cpp | 11 +++---- 5 files changed, 41 insertions(+), 11 deletions(-) create mode 100644 data/shaders/glsl/meshshader/meshshader.task create mode 100644 data/shaders/glsl/meshshader/meshshader.task.spv diff --git a/data/shaders/glsl/meshshader/meshshader.mesh b/data/shaders/glsl/meshshader/meshshader.mesh index 5a958817..2e0a34ce 100644 --- a/data/shaders/glsl/meshshader/meshshader.mesh +++ b/data/shaders/glsl/meshshader/meshshader.mesh @@ -22,15 +22,31 @@ layout(location = 0) out VertexOutput vec4 color; } vertexOutput[]; +const vec4[3] positions = { + vec4( 0.0, -1.0, 0.0, 1.0), + vec4(-1.0, 1.0, 0.0, 1.0), + vec4( 1.0, 1.0, 0.0, 1.0) +}; + +const vec4[3] colors = { + vec4(0.0, 1.0, 0.0, 1.0), + vec4(0.0, 0.0, 1.0, 1.0), + vec4(1.0, 0.0, 0.0, 1.0) +}; + void main() { + uint iid = gl_LocalInvocationID.x; + + vec4 offset = vec4(0.0, 0.0, gl_GlobalInvocationID.x, 0.0); + SetMeshOutputsEXT(3, 1); mat4 mvp = ubo.projection * ubo.view * ubo.model; - gl_MeshVerticesEXT[0].gl_Position = mvp * vec4( 0.0, -1.0, 0.0, 1.0); - gl_MeshVerticesEXT[1].gl_Position = mvp * vec4(-1.0, 1.0, 0.0, 1.0); - gl_MeshVerticesEXT[2].gl_Position = mvp * vec4( 1.0, 1.0, 0.0, 1.0); - vertexOutput[0].color = vec4(0.0, 1.0, 0.0, 1.0); - vertexOutput[1].color = vec4(0.0, 0.0, 1.0, 1.0); - vertexOutput[2].color = vec4(1.0, 0.0, 0.0, 1.0); + gl_MeshVerticesEXT[0].gl_Position = mvp * (positions[0] + offset); + gl_MeshVerticesEXT[1].gl_Position = mvp * (positions[1] + offset); + gl_MeshVerticesEXT[2].gl_Position = mvp * (positions[2] + offset); + vertexOutput[0].color = colors[0]; + vertexOutput[1].color = colors[1]; + vertexOutput[2].color = colors[2]; gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex] = uvec3(0, 1, 2); } diff --git a/data/shaders/glsl/meshshader/meshshader.mesh.spv b/data/shaders/glsl/meshshader/meshshader.mesh.spv index d68603c6b642afa82034a16a76ba0017498a113c..b95fc1c9f57912661aad3c28376b1c60fdb7b036 100644 GIT binary patch literal 3016 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 diff --git a/data/shaders/glsl/meshshader/meshshader.task b/data/shaders/glsl/meshshader/meshshader.task new file mode 100644 index 00000000..47439e91 --- /dev/null +++ b/data/shaders/glsl/meshshader/meshshader.task @@ -0,0 +1,13 @@ +/* Copyright (c) 2021, Sascha Willems + * + * SPDX-License-Identifier: MIT + * + */ + +#version 450 +#extension GL_EXT_mesh_shader : require + +void main() +{ + EmitMeshTasksEXT(3, 1, 1); +} diff --git a/data/shaders/glsl/meshshader/meshshader.task.spv b/data/shaders/glsl/meshshader/meshshader.task.spv new file mode 100644 index 0000000000000000000000000000000000000000..abcbc5df4b76778a6847080adcdcb9eea13ddf5e GIT binary patch literal 300 zcmZXOzY2n26vdDFnNrXnvb|^wq@ki0h!%&yh&B-vY_K7FqxK%6XKHBd9LpiPaPi#x zo!_}S_SA#1(1y?c)BrYa0XVl1?+(f4xKGNwDw3*5v;2Y%_ZF?&D2~GFnuUwyTx1tc z9iX=!Ts)a!sLS+p)$j* g*`t=HnSE;AUNKdi{z)aziyN2Udte|=UiF&98_l*GfB*mh literal 0 HcmV?d00001 diff --git a/examples/meshshader/meshshader.cpp b/examples/meshshader/meshshader.cpp index 260d71d0..8bd1b105 100644 --- a/examples/meshshader/meshshader.cpp +++ b/examples/meshshader/meshshader.cpp @@ -38,8 +38,8 @@ public: timerSpeed *= 0.25f; camera.type = Camera::CameraType::lookat; camera.setPerspective(60.0f, (float)width / (float)height, 0.1f, 512.0f); - camera.setRotation(glm::vec3(0.0f)); - camera.setTranslation(glm::vec3(0.0f, 0.0f, -2.0f)); + camera.setRotation(glm::vec3(0.0f, 15.0f, 0.0f)); + camera.setTranslation(glm::vec3(0.0f, 0.0f, -5.0f)); // Extension require at least Vulkan 1.1 apiVersion = VK_API_VERSION_1_1; @@ -65,7 +65,7 @@ public: { enabledMeshShaderFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV; enabledMeshShaderFeatures.meshShader = VK_TRUE; - enabledMeshShaderFeatures.taskShader = VK_FALSE; + enabledMeshShaderFeatures.taskShader = VK_TRUE; deviceCreatepNextChain = &enabledMeshShaderFeatures; } @@ -158,7 +158,7 @@ public: VkPipelineMultisampleStateCreateInfo multisampleState = vks::initializers::pipelineMultisampleStateCreateInfo(VK_SAMPLE_COUNT_1_BIT, 0); std::vector dynamicStateEnables = { VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR }; VkPipelineDynamicStateCreateInfo dynamicState = vks::initializers::pipelineDynamicStateCreateInfo(dynamicStateEnables); - std::array shaderStages; + std::array shaderStages; VkGraphicsPipelineCreateInfo pipelineCI = vks::initializers::pipelineCreateInfo(pipelineLayout, renderPass, 0); @@ -176,7 +176,8 @@ public: pipelineCI.pStages = shaderStages.data(); shaderStages[0] = loadShader(getShadersPath() + "meshshader/meshshader.mesh.spv", VK_SHADER_STAGE_MESH_BIT_EXT); - shaderStages[1] = loadShader(getShadersPath() + "meshshader/meshshader.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); + shaderStages[1] = loadShader(getShadersPath() + "meshshader/meshshader.task.spv", VK_SHADER_STAGE_TASK_BIT_EXT); + shaderStages[2] = loadShader(getShadersPath() + "meshshader/meshshader.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCI, nullptr, &pipeline)); }