Shading rate pattern and colorization
This commit is contained in:
parent
8d896cd04b
commit
ccadcdd238
2 changed files with 40 additions and 14 deletions
|
|
@ -53,13 +53,32 @@ void main()
|
||||||
|
|
||||||
if (uboScene.colorShadingRates == 1) {
|
if (uboScene.colorShadingRates == 1) {
|
||||||
if (gl_FragmentSizeNV.x == 1 && gl_FragmentSizeNV.y == 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) {
|
if (gl_FragmentSizeNV.x == 2 && gl_FragmentSizeNV.y == 1) {
|
||||||
outFragColor.rgb *= vec3(1.0, 1.0, 0.5);
|
outFragColor.rgb *= vec3(0.2, 0.6, 1.0);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if (gl_FragmentSizeNV.x == 4 || gl_FragmentSizeNV.y == 4) {
|
if (gl_FragmentSizeNV.x == 1 && gl_FragmentSizeNV.y == 2) {
|
||||||
outFragColor.rgb *= vec3(1.0, 0.5, 0.5);
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -171,24 +171,31 @@ void VulkanExample::prepareShadingRateImage()
|
||||||
imageViewCI.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
imageViewCI.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||||
VK_CHECK_RESULT(vkCreateImageView(device, &imageViewCI, nullptr, &shadingRateImage.view));
|
VK_CHECK_RESULT(vkCreateImageView(device, &imageViewCI, nullptr, &shadingRateImage.view));
|
||||||
|
|
||||||
// Populate with shading rate pattern
|
// Populate with lowest possible shading rate pattern
|
||||||
uint8_t val = VK_SHADING_RATE_PALETTE_ENTRY_NO_INVOCATIONS_NV;
|
uint8_t val = VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_4X4_PIXELS_NV;
|
||||||
uint8_t* shadingRatePatternData = new uint8_t[bufferSize];
|
uint8_t* shadingRatePatternData = new uint8_t[bufferSize];
|
||||||
memset(shadingRatePatternData, val, bufferSize);
|
memset(shadingRatePatternData, val, bufferSize);
|
||||||
|
|
||||||
|
// Create a circular pattern with decreasing sampling rates outwards (max. range, pattern)
|
||||||
|
std::map<float, VkShadingRatePaletteEntryNV> 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;
|
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 = (float)imageExtent.width / 2.0f - (float)x;
|
const float deltaX = (float)imageExtent.width / 2.0f - (float)x;
|
||||||
const float deltaY = (float)imageExtent.height / 2.0f - (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 <= 8.0f) {
|
for (auto pattern : patternLookup) {
|
||||||
*ptrData = VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_PIXEL_NV;
|
if (dist <= pattern.first) {
|
||||||
} else {
|
*ptrData = pattern.second;
|
||||||
if (dist <= 16.0f) {
|
break;
|
||||||
*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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ptrData++;
|
ptrData++;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue