From ccadcdd238ad8e6913315760349eea63eee38ca8 Mon Sep 17 00:00:00 2001 From: Sascha Willems Date: Sat, 5 Sep 2020 14:10:02 +0200 Subject: [PATCH] Shading rate pattern and colorization --- .../glsl/variablerateshading/scene.frag | 29 +++++++++++++++---- .../variablerateshading.cpp | 25 ++++++++++------ 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/data/shaders/glsl/variablerateshading/scene.frag b/data/shaders/glsl/variablerateshading/scene.frag index ddc21bdb..1236713a 100644 --- a/data/shaders/glsl/variablerateshading/scene.frag +++ b/data/shaders/glsl/variablerateshading/scene.frag @@ -53,13 +53,32 @@ void main() if (uboScene.colorShadingRates == 1) { if (gl_FragmentSizeNV.x == 1 && gl_FragmentSizeNV.y == 1) { - outFragColor.rgb *= vec3(0.5, 1.0, 0.5); + outFragColor.rgb *= vec3(0.0, 0.8, 0.4); + return; } - if (gl_FragmentSizeNV.x == 2 || gl_FragmentSizeNV.y == 2) { - outFragColor.rgb *= vec3(1.0, 1.0, 0.5); + if (gl_FragmentSizeNV.x == 2 && gl_FragmentSizeNV.y == 1) { + outFragColor.rgb *= vec3(0.2, 0.6, 1.0); + return; } - if (gl_FragmentSizeNV.x == 4 || gl_FragmentSizeNV.y == 4) { - outFragColor.rgb *= vec3(1.0, 0.5, 0.5); + if (gl_FragmentSizeNV.x == 1 && gl_FragmentSizeNV.y == 2) { + outFragColor.rgb *= vec3(0.0, 0.4, 0.8); + return; + } + if (gl_FragmentSizeNV.x == 2 && gl_FragmentSizeNV.y == 2) { + outFragColor.rgb *= vec3(1.0, 1.0, 0.2); + return; + } + if (gl_FragmentSizeNV.x == 4 && gl_FragmentSizeNV.y == 2) { + outFragColor.rgb *= vec3(0.8, 0.8, 0.0); + return; + } + if (gl_FragmentSizeNV.x == 2 && gl_FragmentSizeNV.y == 4) { + outFragColor.rgb *= vec3(1.0, 0.4, 0.2); + return; + } + if (gl_FragmentSizeNV.x == 4 && gl_FragmentSizeNV.y == 4) { + outFragColor.rgb *= vec3(0.8, 0.0, 0.0); + return; } } } \ No newline at end of file diff --git a/examples/variablerateshading/variablerateshading.cpp b/examples/variablerateshading/variablerateshading.cpp index 7d92b44e..1fa83579 100644 --- a/examples/variablerateshading/variablerateshading.cpp +++ b/examples/variablerateshading/variablerateshading.cpp @@ -171,24 +171,31 @@ void VulkanExample::prepareShadingRateImage() imageViewCI.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; VK_CHECK_RESULT(vkCreateImageView(device, &imageViewCI, nullptr, &shadingRateImage.view)); - // Populate with shading rate pattern - uint8_t val = VK_SHADING_RATE_PALETTE_ENTRY_NO_INVOCATIONS_NV; + // Populate with lowest possible shading rate pattern + uint8_t val = VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_4X4_PIXELS_NV; uint8_t* shadingRatePatternData = new uint8_t[bufferSize]; memset(shadingRatePatternData, val, bufferSize); + // Create a circular pattern with decreasing sampling rates outwards (max. range, pattern) + std::map patternLookup = { + { 8.0f, VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_PIXEL_NV }, + { 12.0f, VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_2X1_PIXELS_NV }, + { 16.0f, VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_1X2_PIXELS_NV }, + { 18.0f, VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_2X2_PIXELS_NV }, + { 20.0f, VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_4X2_PIXELS_NV }, + { 24.0f, VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_2X4_PIXELS_NV } + }; + 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 = (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 <= 8.0f) { - *ptrData = VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_PIXEL_NV; - } else { - 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; + for (auto pattern : patternLookup) { + if (dist <= pattern.first) { + *ptrData = pattern.second; + break; } } ptrData++;