Toggle for shading rate pattern color visualization

This commit is contained in:
Sascha Willems 2020-09-02 20:07:37 +02:00
parent 236595c940
commit 14aebeddbb
4 changed files with 38 additions and 5 deletions

View file

@ -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);
}
}
}

View file

@ -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;

View file

@ -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<VkDescriptorSetLayoutBinding> 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()

View file

@ -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;