Toggle for shading rate pattern color visualization
This commit is contained in:
parent
236595c940
commit
14aebeddbb
4 changed files with 38 additions and 5 deletions
|
|
@ -12,6 +12,16 @@ layout (location = 3) in vec3 inViewVec;
|
||||||
layout (location = 4) in vec3 inLightVec;
|
layout (location = 4) in vec3 inLightVec;
|
||||||
layout (location = 5) in vec4 inTangent;
|
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 (location = 0) out vec4 outFragColor;
|
||||||
|
|
||||||
layout (constant_id = 0) const bool ALPHA_MASK = false;
|
layout (constant_id = 0) const bool ALPHA_MASK = false;
|
||||||
|
|
@ -40,4 +50,17 @@ void main()
|
||||||
vec3 diffuse = max(dot(N, L), ambient).rrr;
|
vec3 diffuse = max(dot(N, L), ambient).rrr;
|
||||||
float specular = pow(max(dot(R, V), 0.0), 32.0);
|
float specular = pow(max(dot(R, V), 0.0), 32.0);
|
||||||
outFragColor = vec4(diffuse * color.rgb + specular, color.a);
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -13,6 +13,7 @@ layout (set = 0, binding = 0) uniform UBOScene
|
||||||
mat4 model;
|
mat4 model;
|
||||||
vec4 lightPos;
|
vec4 lightPos;
|
||||||
vec4 viewPos;
|
vec4 viewPos;
|
||||||
|
int colorShadingRates;
|
||||||
} uboScene;
|
} uboScene;
|
||||||
|
|
||||||
layout (location = 0) out vec3 outNormal;
|
layout (location = 0) out vec3 outNormal;
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ VulkanExample::VulkanExample() : VulkanExampleBase(ENABLE_VALIDATION)
|
||||||
camera.setPosition(glm::vec3(0.0f, 1.0f, 0.0f));
|
camera.setPosition(glm::vec3(0.0f, 1.0f, 0.0f));
|
||||||
camera.setRotation(glm::vec3(0.0f, -90.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.setPerspective(60.0f, (float)width / (float)height, 0.1f, 256.0f);
|
||||||
|
camera.setRotationSpeed(0.25f);
|
||||||
settings.overlay = true;
|
settings.overlay = true;
|
||||||
enabledInstanceExtensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
|
enabledInstanceExtensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
|
||||||
enabledDeviceExtensions.push_back(VK_NV_SHADING_RATE_IMAGE_EXTENSION_NAME);
|
enabledDeviceExtensions.push_back(VK_NV_SHADING_RATE_IMAGE_EXTENSION_NAME);
|
||||||
|
|
@ -97,7 +98,7 @@ void VulkanExample::setupDescriptors()
|
||||||
|
|
||||||
// Descriptor set layout
|
// Descriptor set layout
|
||||||
const std::vector<VkDescriptorSetLayoutBinding> setLayoutBindings = {
|
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);
|
VkDescriptorSetLayoutCreateInfo descriptorLayout = vks::initializers::descriptorSetLayoutCreateInfo(setLayoutBindings);
|
||||||
VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorLayout, nullptr, &descriptorSetLayout));
|
VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorLayout, nullptr, &descriptorSetLayout));
|
||||||
|
|
@ -171,13 +172,13 @@ void VulkanExample::prepareShadingRateImage()
|
||||||
uint8_t* ptrData = shadingRatePatternData;
|
uint8_t* ptrData = shadingRatePatternData;
|
||||||
for (uint32_t y = 0; y < imageExtent.height; y++) {
|
for (uint32_t y = 0; y < imageExtent.height; y++) {
|
||||||
for (uint32_t x = 0; x < imageExtent.width; x++) {
|
for (uint32_t x = 0; x < imageExtent.width; x++) {
|
||||||
const float deltaX = imageExtent.width / 2 - (float)x;
|
const float deltaX = (float)imageExtent.width / 2.0f - (float)x;
|
||||||
const float deltaY = imageExtent.height / 2 - (float)y;
|
const float deltaY = (float)imageExtent.height / 2.0f - (float)y;
|
||||||
const float dist = std::sqrt(deltaX * deltaX + deltaY * deltaY);
|
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;
|
*ptrData = VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_PIXEL_NV;
|
||||||
} else {
|
} else {
|
||||||
if (dist <= 32.0f) {
|
if (dist <= 16.0f) {
|
||||||
*ptrData = VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_2X2_PIXELS_NV;
|
*ptrData = VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_2X2_PIXELS_NV;
|
||||||
} else {
|
} else {
|
||||||
*ptrData = VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_4X4_PIXELS_NV;
|
*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.projection = camera.matrices.perspective;
|
||||||
shaderData.values.view = camera.matrices.view;
|
shaderData.values.view = camera.matrices.view;
|
||||||
shaderData.values.viewPos = camera.viewPos;
|
shaderData.values.viewPos = camera.viewPos;
|
||||||
|
shaderData.values.colorShadingRate = colorShadingRate;
|
||||||
memcpy(shaderData.buffer.mapped, &shaderData.values, sizeof(shaderData.values));
|
memcpy(shaderData.buffer.mapped, &shaderData.values, sizeof(shaderData.values));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -360,6 +362,10 @@ void VulkanExample::render()
|
||||||
|
|
||||||
void VulkanExample::OnUpdateUIOverlay(vks::UIOverlay* overlay)
|
void VulkanExample::OnUpdateUIOverlay(vks::UIOverlay* overlay)
|
||||||
{
|
{
|
||||||
|
if (overlay->checkBox("Color shading rates", &colorShadingRate)) {
|
||||||
|
updateUniformBuffers();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VULKAN_EXAMPLE_MAIN()
|
VULKAN_EXAMPLE_MAIN()
|
||||||
|
|
@ -22,6 +22,8 @@ public:
|
||||||
VkImageView view;
|
VkImageView view;
|
||||||
} shadingRateImage;
|
} shadingRateImage;
|
||||||
|
|
||||||
|
bool colorShadingRate = false;
|
||||||
|
|
||||||
struct ShaderData {
|
struct ShaderData {
|
||||||
vks::Buffer buffer;
|
vks::Buffer buffer;
|
||||||
struct Values {
|
struct Values {
|
||||||
|
|
@ -30,6 +32,7 @@ public:
|
||||||
glm::mat4 model = glm::mat4(1.0f);
|
glm::mat4 model = glm::mat4(1.0f);
|
||||||
glm::vec4 lightPos = glm::vec4(0.0f, -5.0f, 0.0f, 1.0f);
|
glm::vec4 lightPos = glm::vec4(0.0f, -5.0f, 0.0f, 1.0f);
|
||||||
glm::vec4 viewPos;
|
glm::vec4 viewPos;
|
||||||
|
int32_t colorShadingRate;
|
||||||
} values;
|
} values;
|
||||||
} shaderData;
|
} shaderData;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue