diff --git a/data/shaders/glsl/variablerateshading/scene.frag b/data/shaders/glsl/variablerateshading/scene.frag index 4796f1ca..3de8c8a0 100644 --- a/data/shaders/glsl/variablerateshading/scene.frag +++ b/data/shaders/glsl/variablerateshading/scene.frag @@ -12,6 +12,16 @@ layout (location = 3) in vec3 inViewVec; layout (location = 4) in vec3 inLightVec; layout (location = 5) in vec4 inTangent; +layout (set = 0, binding = 0) uniform UBOScene +{ + mat4 projection; + mat4 view; + mat4 model; + vec4 lightPos; + vec4 viewPos; + int colorShadingRates; +} uboScene; + layout (location = 0) out vec4 outFragColor; layout (constant_id = 0) const bool ALPHA_MASK = false; @@ -40,4 +50,17 @@ void main() vec3 diffuse = max(dot(N, L), ambient).rrr; float specular = pow(max(dot(R, V), 0.0), 32.0); outFragColor = vec4(diffuse * color.rgb + specular, color.a); + + if (uboScene.colorShadingRates == 1) { + outFragColor = vec4(diffuse * vec3(1.0) + specular, color.a); + if (gl_FragmentSizeNV.x == 1 && gl_FragmentSizeNV.y == 1) { + outFragColor.rgb *= vec3(0.5, 1.0, 0.5); + } + if (gl_FragmentSizeNV.x == 2 || gl_FragmentSizeNV.y == 2) { + outFragColor.rgb *= vec3(1.0, 1.0, 0.5); + } + if (gl_FragmentSizeNV.x == 4 || gl_FragmentSizeNV.y == 4) { + outFragColor.rgb *= vec3(1.0, 0.5, 0.5); + } + } } \ No newline at end of file diff --git a/data/shaders/glsl/variablerateshading/scene.vert b/data/shaders/glsl/variablerateshading/scene.vert index 7bfa122e..bf4e03ed 100644 --- a/data/shaders/glsl/variablerateshading/scene.vert +++ b/data/shaders/glsl/variablerateshading/scene.vert @@ -13,6 +13,7 @@ layout (set = 0, binding = 0) uniform UBOScene mat4 model; vec4 lightPos; vec4 viewPos; + int colorShadingRates; } uboScene; layout (location = 0) out vec3 outNormal; diff --git a/examples/variablerateshading/variablerateshading.cpp b/examples/variablerateshading/variablerateshading.cpp index 758a5409..66d3eebc 100644 --- a/examples/variablerateshading/variablerateshading.cpp +++ b/examples/variablerateshading/variablerateshading.cpp @@ -16,6 +16,7 @@ VulkanExample::VulkanExample() : VulkanExampleBase(ENABLE_VALIDATION) camera.setPosition(glm::vec3(0.0f, 1.0f, 0.0f)); camera.setRotation(glm::vec3(0.0f, -90.0f, 0.0f)); camera.setPerspective(60.0f, (float)width / (float)height, 0.1f, 256.0f); + camera.setRotationSpeed(0.25f); settings.overlay = true; enabledInstanceExtensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); enabledDeviceExtensions.push_back(VK_NV_SHADING_RATE_IMAGE_EXTENSION_NAME); @@ -97,7 +98,7 @@ void VulkanExample::setupDescriptors() // Descriptor set layout const std::vector setLayoutBindings = { - vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT, 0), + vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0), }; VkDescriptorSetLayoutCreateInfo descriptorLayout = vks::initializers::descriptorSetLayoutCreateInfo(setLayoutBindings); VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorLayout, nullptr, &descriptorSetLayout)); @@ -171,13 +172,13 @@ void VulkanExample::prepareShadingRateImage() uint8_t* ptrData = shadingRatePatternData; for (uint32_t y = 0; y < imageExtent.height; y++) { for (uint32_t x = 0; x < imageExtent.width; x++) { - const float deltaX = imageExtent.width / 2 - (float)x; - const float deltaY = imageExtent.height / 2 - (float)y; + const float deltaX = (float)imageExtent.width / 2.0f - (float)x; + const float deltaY = (float)imageExtent.height / 2.0f - (float)y; const float dist = std::sqrt(deltaX * deltaX + deltaY * deltaY); - if (dist <= 16.0f) { + if (dist <= 8.0f) { *ptrData = VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_PIXEL_NV; } else { - if (dist <= 32.0f) { + if (dist <= 16.0f) { *ptrData = VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_2X2_PIXELS_NV; } else { *ptrData = VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_4X4_PIXELS_NV; @@ -325,6 +326,7 @@ void VulkanExample::updateUniformBuffers() shaderData.values.projection = camera.matrices.perspective; shaderData.values.view = camera.matrices.view; shaderData.values.viewPos = camera.viewPos; + shaderData.values.colorShadingRate = colorShadingRate; memcpy(shaderData.buffer.mapped, &shaderData.values, sizeof(shaderData.values)); } @@ -360,6 +362,10 @@ void VulkanExample::render() void VulkanExample::OnUpdateUIOverlay(vks::UIOverlay* overlay) { + if (overlay->checkBox("Color shading rates", &colorShadingRate)) { + updateUniformBuffers(); + } + } VULKAN_EXAMPLE_MAIN() \ No newline at end of file diff --git a/examples/variablerateshading/variablerateshading.h b/examples/variablerateshading/variablerateshading.h index 0eda31a7..4bc4ad13 100644 --- a/examples/variablerateshading/variablerateshading.h +++ b/examples/variablerateshading/variablerateshading.h @@ -22,6 +22,8 @@ public: VkImageView view; } shadingRateImage; + bool colorShadingRate = false; + struct ShaderData { vks::Buffer buffer; struct Values { @@ -30,6 +32,7 @@ public: glm::mat4 model = glm::mat4(1.0f); glm::vec4 lightPos = glm::vec4(0.0f, -5.0f, 0.0f, 1.0f); glm::vec4 viewPos; + int32_t colorShadingRate; } values; } shaderData;