diff --git a/data/shaders/radialblur/colorpass.frag b/data/shaders/radialblur/colorpass.frag index b23b0129..d4d8a25e 100644 --- a/data/shaders/radialblur/colorpass.frag +++ b/data/shaders/radialblur/colorpass.frag @@ -3,11 +3,22 @@ #extension GL_ARB_separate_shader_objects : enable #extension GL_ARB_shading_language_420pack : enable +layout (binding = 1) uniform sampler2D samplerGradientRamp; + layout (location = 0) in vec3 inColor; +layout (location = 1) in vec2 inUV; layout (location = 0) out vec4 outFragColor; void main() { - outFragColor.rgb = inColor; + // Use max. color channel value to detect bright glow emitters + if ((inColor.r >= 0.9) || (inColor.g >= 0.9) || (inColor.b >= 0.9)) + { + outFragColor.rgb = texture(samplerGradientRamp, inUV).rgb; + } + else + { + outFragColor.rgb = inColor; + } } \ No newline at end of file diff --git a/data/shaders/radialblur/colorpass.frag.spv b/data/shaders/radialblur/colorpass.frag.spv index 7fad085d..bf3e9bcc 100644 Binary files a/data/shaders/radialblur/colorpass.frag.spv and b/data/shaders/radialblur/colorpass.frag.spv differ diff --git a/data/shaders/radialblur/colorpass.vert b/data/shaders/radialblur/colorpass.vert index abd9082e..bd8a9ce2 100644 --- a/data/shaders/radialblur/colorpass.vert +++ b/data/shaders/radialblur/colorpass.vert @@ -3,16 +3,18 @@ #extension GL_ARB_separate_shader_objects : enable #extension GL_ARB_shading_language_420pack : enable -layout (location = 0) in vec4 inPos; +layout (location = 0) in vec3 inPos; layout (location = 2) in vec3 inColor; layout (binding = 0) uniform UBO { mat4 projection; mat4 model; + float gradientPos; } ubo; layout (location = 0) out vec3 outColor; +layout (location = 1) out vec2 outUV; out gl_PerVertex { @@ -22,5 +24,6 @@ out gl_PerVertex void main() { outColor = inColor; - gl_Position = ubo.projection * ubo.model * inPos; + outUV = vec2(ubo.gradientPos, 0.0f); + gl_Position = ubo.projection * ubo.model * vec4(inPos, 1.0); } diff --git a/data/shaders/radialblur/colorpass.vert.spv b/data/shaders/radialblur/colorpass.vert.spv index 2cce8d4a..7e400627 100644 Binary files a/data/shaders/radialblur/colorpass.vert.spv and b/data/shaders/radialblur/colorpass.vert.spv differ diff --git a/data/shaders/radialblur/phongpass.frag b/data/shaders/radialblur/phongpass.frag index 53775191..2b855250 100644 --- a/data/shaders/radialblur/phongpass.frag +++ b/data/shaders/radialblur/phongpass.frag @@ -3,10 +3,13 @@ #extension GL_ARB_separate_shader_objects : enable #extension GL_ARB_shading_language_420pack : enable +layout (binding = 1) uniform sampler2D samplerGradientRamp; + layout (location = 0) in vec3 inNormal; layout (location = 1) in vec3 inColor; layout (location = 2) in vec3 inEyePos; layout (location = 3) in vec3 inLightVec; +layout (location = 4) in vec2 inUV; layout (location = 0) out vec4 outFragColor; @@ -17,7 +20,7 @@ void main() // to detect bright glow emitters if ((inColor.r >= 0.9) || (inColor.g >= 0.9) || (inColor.b >= 0.9)) { - outFragColor.rgb = inColor; + outFragColor.rgb = texture(samplerGradientRamp, inUV).rgb; } else { diff --git a/data/shaders/radialblur/phongpass.frag.spv b/data/shaders/radialblur/phongpass.frag.spv index f0d494cd..cd300965 100644 Binary files a/data/shaders/radialblur/phongpass.frag.spv and b/data/shaders/radialblur/phongpass.frag.spv differ diff --git a/data/shaders/radialblur/phongpass.vert b/data/shaders/radialblur/phongpass.vert index 5f744df3..eb8e6748 100644 --- a/data/shaders/radialblur/phongpass.vert +++ b/data/shaders/radialblur/phongpass.vert @@ -11,12 +11,14 @@ layout (binding = 0) uniform UBO { mat4 projection; mat4 model; + float gradientPos; } ubo; layout (location = 0) out vec3 outNormal; layout (location = 1) out vec3 outColor; layout (location = 2) out vec3 outEyePos; layout (location = 3) out vec3 outLightVec; +layout (location = 4) out vec2 outUV; out gl_PerVertex { @@ -27,6 +29,7 @@ void main() { outNormal = inNormal; outColor = inColor; + outUV = vec2(ubo.gradientPos, 0.0); gl_Position = ubo.projection * ubo.model * pos; outEyePos = vec3(ubo.model * pos); vec4 lightPos = vec4(0.0, 0.0, -5.0, 1.0);// * ubo.model; diff --git a/data/shaders/radialblur/phongpass.vert.spv b/data/shaders/radialblur/phongpass.vert.spv index fa3a8ddb..7ad5cda7 100644 Binary files a/data/shaders/radialblur/phongpass.vert.spv and b/data/shaders/radialblur/phongpass.vert.spv differ diff --git a/data/shaders/radialblur/radialblur.frag b/data/shaders/radialblur/radialblur.frag index 27ca176a..e1bfae5b 100644 --- a/data/shaders/radialblur/radialblur.frag +++ b/data/shaders/radialblur/radialblur.frag @@ -26,7 +26,7 @@ void main() vec4 color = vec4(0.0, 0.0, 0.0, 0.0); UV += radialSize * 0.5 - ubo.radialOrigin; - #define samples 16 + #define samples 32 for (int i = 0; i < samples; i++) { diff --git a/data/shaders/radialblur/radialblur.frag.spv b/data/shaders/radialblur/radialblur.frag.spv index b348e565..f1c85ca5 100644 Binary files a/data/shaders/radialblur/radialblur.frag.spv and b/data/shaders/radialblur/radialblur.frag.spv differ diff --git a/radialblur/radialblur.cpp b/radialblur/radialblur.cpp index 47876746..5a6d77e4 100644 --- a/radialblur/radialblur.cpp +++ b/radialblur/radialblur.cpp @@ -47,6 +47,10 @@ public: vkMeshLoader::MeshBuffer quad; } meshes; + struct { + vkTools::VulkanTexture gradient; + } textures; + struct { VkPipelineVertexInputStateCreateInfo inputState; std::vector bindingDescriptions; @@ -59,18 +63,14 @@ public: vkTools::UniformData fsQuad; } uniformData; - struct { + struct UboVS { glm::mat4 projection; glm::mat4 model; - } uboVS; + float gradientPos = 0.0f; + } uboSceneVS, uboQuadVS; - struct { - glm::mat4 projection; - glm::mat4 model; - } uboQuadVS; - - struct { - float radialBlurScale = 0.25f; + struct UboQuadFS { + float radialBlurScale = 0.35f; float radialBlurStrength = 0.75f; glm::vec2 radialOrigin = glm::vec2(0.5f, 0.5f); } uboQuadFS; @@ -165,6 +165,8 @@ public: vkFreeCommandBuffers(device, cmdPool, 1, &offscreenPass.commandBuffer); vkDestroySemaphore(device, offscreenPass.semaphore, nullptr); + + textureLoader->destroyTexture(textures.gradient); } // Setup the offscreen framebuffer for rendering the blurred scene @@ -457,6 +459,7 @@ public: void loadAssets() { loadMesh(getAssetPath() + "models/glowsphere.dae", &meshes.example, vertexLayout, 0.05f); + textureLoader->loadTexture(getAssetPath() + "textures/particle_gradient_rgba.ktx", VK_FORMAT_R8G8B8A8_UNORM, &textures.gradient, false); } // Setup vertices for a single uv-mapped quad @@ -552,7 +555,7 @@ public: std::vector poolSizes = { vkTools::initializers::descriptorPoolSize(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 4), - vkTools::initializers::descriptorPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2) + vkTools::initializers::descriptorPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 6) }; VkDescriptorPoolCreateInfo descriptorPoolInfo = @@ -649,7 +652,14 @@ public: descriptorSets.scene, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vsQuad.descriptor) + &uniformData.vsQuad.descriptor), + // Binding 1 : Color gradient sampler + vkTools::initializers::writeDescriptorSet( + descriptorSets.scene, + VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, + 1, + &textures.gradient.descriptor) + }; vkUpdateDescriptorSets(device, offScreenWriteDescriptorSets.size(), offScreenWriteDescriptorSets.data(), 0, NULL); } @@ -765,8 +775,8 @@ public: createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboVS), - &uboVS, + sizeof(uboSceneVS), + &uboSceneVS, &uniformData.vsScene.buffer, &uniformData.vsScene.memory, &uniformData.vsScene.descriptor); @@ -775,8 +785,8 @@ public: createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboVS), - &uboVS, + sizeof(uboQuadVS), + &uboQuadVS, &uniformData.vsQuad.buffer, &uniformData.vsQuad.memory, &uniformData.vsQuad.descriptor); @@ -808,6 +818,11 @@ public: uboQuadVS.model = glm::rotate(uboQuadVS.model, glm::radians(timer * 360.0f), glm::vec3(0.0f, 1.0f, 0.0f)); uboQuadVS.model = glm::rotate(uboQuadVS.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); + if (!paused) + { + uboQuadVS.gradientPos += frameTimer * 0.1f; + } + uint8_t *pData; VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsQuad.memory, 0, sizeof(uboQuadVS), 0, (void **)&pData)); memcpy(pData, &uboQuadVS, sizeof(uboQuadVS)); @@ -818,14 +833,19 @@ public: void updateUniformBuffersScreen() { // Vertex shader - uboVS.projection = glm::ortho(0.0f, 1.0f, 0.0f, 1.0f, -1.0f, 1.0f); - uboVS.model = glm::mat4(); + uboSceneVS.projection = glm::ortho(0.0f, 1.0f, 0.0f, 1.0f, -1.0f, 1.0f); + uboSceneVS.model = glm::mat4(); uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsScene.memory, 0, sizeof(uboVS), 0, (void **)&pData)); - memcpy(pData, &uboVS, sizeof(uboVS)); + VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsScene.memory, 0, sizeof(uboSceneVS), 0, (void **)&pData)); + memcpy(pData, &uboSceneVS, sizeof(uboSceneVS)); vkUnmapMemory(device, uniformData.vsScene.memory); + if (!paused) + { + uboSceneVS.gradientPos += uboQuadVS.gradientPos; + } + // Fragment shader VK_CHECK_RESULT(vkMapMemory(device, uniformData.fsQuad.memory, 0, sizeof(uboQuadFS), 0, (void **)&pData)); memcpy(pData, &uboQuadFS, sizeof(uboQuadFS));