UI button for updating inline uniform blocks at runtime
This commit is contained in:
parent
367fce5b46
commit
38cd7581b6
1 changed files with 47 additions and 5 deletions
|
|
@ -194,7 +194,6 @@ public:
|
||||||
{
|
{
|
||||||
std::vector<VkDescriptorSetLayoutBinding> setLayoutBindings = {
|
std::vector<VkDescriptorSetLayoutBinding> setLayoutBindings = {
|
||||||
vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0),
|
vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0),
|
||||||
vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_FRAGMENT_BIT, 1),
|
|
||||||
};
|
};
|
||||||
VkDescriptorSetLayoutCreateInfo descriptorLayoutCI = vks::initializers::descriptorSetLayoutCreateInfo(setLayoutBindings);
|
VkDescriptorSetLayoutCreateInfo descriptorLayoutCI = vks::initializers::descriptorSetLayoutCreateInfo(setLayoutBindings);
|
||||||
VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorLayoutCI, nullptr, &descriptorSetLayouts.scene));
|
VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorLayoutCI, nullptr, &descriptorSetLayouts.scene));
|
||||||
|
|
@ -235,10 +234,9 @@ public:
|
||||||
{
|
{
|
||||||
// Pool
|
// Pool
|
||||||
std::vector<VkDescriptorPoolSize> poolSizes = {
|
std::vector<VkDescriptorPoolSize> poolSizes = {
|
||||||
vks::initializers::descriptorPoolSize(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, (static_cast<uint32_t>(objects.size()) + 1)),
|
vks::initializers::descriptorPoolSize(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1),
|
||||||
/* [POI] TODO */
|
/* [POI] Allocate inline uniform blocks */
|
||||||
// TODO: split scene and object
|
vks::initializers::descriptorPoolSize(VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, static_cast<uint32_t>(objects.size()) * sizeof(Object::Material)),
|
||||||
vks::initializers::descriptorPoolSize(VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, (static_cast<uint32_t>(objects.size()) + 1) * sizeof(Object::Material)),
|
|
||||||
};
|
};
|
||||||
VkDescriptorPoolCreateInfo descriptorPoolCI = vks::initializers::descriptorPoolCreateInfo(poolSizes, static_cast<uint32_t>(objects.size()) + 1);
|
VkDescriptorPoolCreateInfo descriptorPoolCI = vks::initializers::descriptorPoolCreateInfo(poolSizes, static_cast<uint32_t>(objects.size()) + 1);
|
||||||
|
|
||||||
|
|
@ -387,9 +385,53 @@ public:
|
||||||
updateUniformBuffers();
|
updateUniformBuffers();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
[POI] Update descriptor sets at runtime
|
||||||
|
*/
|
||||||
|
void updateMaterials() {
|
||||||
|
// Setup random materials for every object in the scene
|
||||||
|
for (uint32_t i = 0; i < objects.size(); i++) {
|
||||||
|
objects[i].material.r = glm::clamp(rnd(), 0.005f, 1.0f);
|
||||||
|
objects[i].material.g = glm::clamp(rnd(), 0.005f, 1.0f);
|
||||||
|
objects[i].material.b = glm::clamp(rnd(), 0.005f, 1.0f);
|
||||||
|
objects[i].material.ambient = 0.05f;
|
||||||
|
objects[i].material.roughness = glm::clamp(rnd(), 0.005f, 1.0f);
|
||||||
|
objects[i].material.metallic = glm::clamp(rnd(), 0.005f, 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto &object : objects) {
|
||||||
|
/*
|
||||||
|
[POI] New structure that defines size and data of the inline uniform block needs to be chained into the write descriptor set
|
||||||
|
We will be using this inline uniform block to pass per-object material information to the fragment shader
|
||||||
|
*/
|
||||||
|
VkWriteDescriptorSetInlineUniformBlockEXT writeDescriptorSetInlineUniformBlock{};
|
||||||
|
writeDescriptorSetInlineUniformBlock.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT;
|
||||||
|
writeDescriptorSetInlineUniformBlock.dataSize = sizeof(Object::Material);
|
||||||
|
// Uniform data for the inline block
|
||||||
|
writeDescriptorSetInlineUniformBlock.pData = &object.material;
|
||||||
|
|
||||||
|
/*
|
||||||
|
[POI] Update the object's inline uniform block
|
||||||
|
*/
|
||||||
|
VkWriteDescriptorSet writeDescriptorSet{};
|
||||||
|
writeDescriptorSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||||
|
writeDescriptorSet.descriptorType = VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT;
|
||||||
|
writeDescriptorSet.dstSet = object.descriptorSet;
|
||||||
|
writeDescriptorSet.dstBinding = 0;
|
||||||
|
writeDescriptorSet.descriptorCount = sizeof(Object::Material);
|
||||||
|
writeDescriptorSet.pNext = &writeDescriptorSetInlineUniformBlock;
|
||||||
|
|
||||||
|
vkUpdateDescriptorSets(device, 1, &writeDescriptorSet, 0, nullptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
virtual void OnUpdateUIOverlay(vks::UIOverlay *overlay)
|
virtual void OnUpdateUIOverlay(vks::UIOverlay *overlay)
|
||||||
{
|
{
|
||||||
|
if (overlay->button("Randomize")) {
|
||||||
|
updateMaterials();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
VULKAN_EXAMPLE_MAIN()
|
VULKAN_EXAMPLE_MAIN()
|
||||||
Loading…
Add table
Add a link
Reference in a new issue