the struct
VkDescriptorSetLayoutBinding
has a member descriptorCount
describing the amount of elements of a descriptor array,
my question is how to access this descriptor array from shader side?
Here’s the code corresponds to my picture:
struct of my uniform buffer:
struct UniformBufferObject {
glm::mat4 model;
glm::mat4 view;
glm::mat4 proj;
};
struct UniformBufferObjectTest {
glm::mat4 model;
glm::mat4 view;
};
Descriptor buffer infos:
VkDescriptorBufferInfo bufferInfo0{};
bufferInfo0.buffer = uniformBuffers[i];
bufferInfo0.offset = 0;
bufferInfo0.range = sizeof(UniformBufferObject::model) + sizeof(UniformBufferObject::view);
VkDescriptorBufferInfo bufferInfo1{};
bufferInfo1.buffer = uniformBuffers[i];
bufferInfo1.offset = offsetof(UniformBufferObject, proj);
bufferInfo1.range = sizeof(UniformBufferObject::proj);
std::vector< VkDescriptorBufferInfo> bufferInfos = { bufferInfo0, bufferInfo1 };
VkDescriptorBufferInfo bufferInfo2{};
bufferInfo2.buffer = uniformBuffersTest[i];
bufferInfo2.offset = 0;
bufferInfo2.range = sizeof(UniformBufferObjectTest);
Write descriptor sets:
std::array<VkWriteDescriptorSet, 3> writeDescriptorSets{};
/*
Binding 0: Object matrices Uniform buffer
*/
writeDescriptorSets[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
writeDescriptorSets[0].dstSet = descriptorSetsWrite[i];
writeDescriptorSets[0].dstBinding = 0;
writeDescriptorSets[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
writeDescriptorSets[0].pBufferInfo = bufferInfos.data();
writeDescriptorSets[0].descriptorCount = 2;
writeDescriptorSets[0].dstArrayElement = 0;
/*
Binding 1: test purposes uniform buffer
*/
writeDescriptorSets[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
writeDescriptorSets[1].dstSet = descriptorSetsWrite[i];
writeDescriptorSets[1].dstBinding = 1;
writeDescriptorSets[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
// Images use a different descriptor structure, so we use pImageInfo instead of pBufferInfo
writeDescriptorSets[1].pBufferInfo = &bufferInfo2;
writeDescriptorSets[1].descriptorCount = 1;
writeDescriptorSets[1].dstArrayElement = 0;
And my vertex shader:
#version 460
#extension GL_ARB_separate_shader_objects : enable
#extension GL_EXT_debug_printf : enable
//#extension GL_KHR_vulkan_glsl : enable
layout(set = 0,binding = 0) uniform UniformBufferObject{
mat4 model;
mat4 view;
mat4 proj;
} ubo1;
layout(set = 0,binding = 1) uniform UniformBufferObjectTest {
mat4 model;
mat4 view;
} uboTest;
//Input
layout(location = 0) in vec3 inPosition;
layout(location = 1) in vec3 inColor;
layout(location = 2) in vec2 inTexCoord;
layout(location = 3) in mat4 instanceMatrix;
//Output
layout(location = 0) out vec3 fragColor;
layout(location = 1) out vec2 fragTexCoord;
void main()
{
gl_Position = ubo1.proj * uboTest.view * uboTest.model* instanceMatrix * vec4(inPosition, 1.0);
fragColor = inColor;
fragTexCoord = inTexCoord;
}