Applications specify vertex input attribute and vertex input binding
descriptions as part of graphics pipeline creation.
The VkGraphicsPipelineCreateInfo
::pVertexInputState
points to a
structure of type VkPipelineVertexInputStateCreateInfo
.
The VkPipelineVertexInputStateCreateInfo
structure is defined as:
typedef struct VkPipelineVertexInputStateCreateInfo { VkStructureType sType; const void* pNext; VkPipelineVertexInputStateCreateFlags flags; uint32_t vertexBindingDescriptionCount; const VkVertexInputBindingDescription* pVertexBindingDescriptions; uint32_t vertexAttributeDescriptionCount; const VkVertexInputAttributeDescription* pVertexAttributeDescriptions; } VkPipelineVertexInputStateCreateInfo;
sType
is the type of this structure.
pNext
is NULL
or a pointer to an extension-specific structure.
flags
is reserved for future use.
vertexBindingDescriptionCount
is the number of vertex binding
descriptions provided in pVertexBindingDescriptions
.
pVertexBindingDescriptions
is a pointer to an array of
VkVertexInputBindingDescription
structures.
vertexAttributeDescriptionCount
is the number of vertex attribute
descriptions provided in pVertexAttributeDescriptions
.
pVertexAttributeDescriptions
is a pointer to an array of
VkVertexInputAttributeDescription
structures.
Each vertex input binding is specified by an instance of the
VkVertexInputBindingDescription
structure.
The VkVertexInputBindingDescription
structure is defined as:
typedef struct VkVertexInputBindingDescription { uint32_t binding; uint32_t stride; VkVertexInputRate inputRate; } VkVertexInputBindingDescription;
binding
is the binding number that this structure describes.
stride
is the distance in bytes between two consecutive elements
within the buffer.
inputRate
specifies whether vertex attribute addressing is a
function of the vertex index or of the instance index.
Possible values include:
typedef enum VkVertexInputRate { VK_VERTEX_INPUT_RATE_VERTEX = 0, VK_VERTEX_INPUT_RATE_INSTANCE = 1, } VkVertexInputRate;
VK_VERTEX_INPUT_RATE_VERTEX
indicates that vertex attribute
addressing is a function of the vertex index.
VK_VERTEX_INPUT_RATE_INSTANCE
indicates that vertex attribute
addressing is a function of the instance index.
Each vertex input attribute is specified by an instance of the
VkVertexInputAttributeDescription
structure.
The VkVertexInputAttributeDescription
structure is defined as:
typedef struct VkVertexInputAttributeDescription { uint32_t location; uint32_t binding; VkFormat format; uint32_t offset; } VkVertexInputAttributeDescription;
location
is the shader binding location number for this attribute.
binding
is the binding number which this attribute takes its data
from.
format
is the size and type of the vertex attribute data.
offset
is a byte offset of this attribute relative to the start of
an element in the vertex input binding.
To bind vertex buffers to a command buffer for use in subsequent draw commands, call:
void vkCmdBindVertexBuffers( VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets);
commandBuffer
is the command buffer into which the command is
recorded.
firstBinding
is the index of the first vertex input binding whose
state is updated by the command.
bindingCount
is the number of vertex input bindings whose state is
updated by the command.
pBuffers
is a pointer to an array of buffer handles.
pOffsets
is a pointer to an array of buffer offsets.
The values taken from elements i of pBuffers
and pOffsets
replace the current state for the vertex input binding
firstBinding
+ i, for i in [0, bindingCount
).
The vertex input binding is updated to start at the offset indicated by
pOffsets
[i] from the start of the buffer pBuffers
[i].
All vertex input attributes that use each of these bindings will use these
updated addresses in their address calculations for subsequent draw
commands.
The address of each attribute for each vertexIndex
and
instanceIndex
is calculated as follows:
VkPipelineVertexInputStateCreateInfo
::pVertexAttributeDescriptions
with VkVertexInputAttributeDescription
::location
equal to
the vertex input attribute number.
VkPipelineVertexInputStateCreateInfo
::pVertexBindingDescriptions
with VkVertexInputAttributeDescription
::binding
equal to
attribDesc.binding.
vertexIndex
be the index of the vertex within the draw (a value
between firstVertex
and firstVertex
+vertexCount
for
vkCmdDraw
, or a value taken from the index buffer for
vkCmdDrawIndexed
), and let instanceIndex
be the instance
number of the draw (a value between firstInstance
and
firstInstance
+instanceCount
).
bufferBindingAddress = buffer[binding].baseAddress + offset[binding]; if (bindingDesc.inputRate == VK_VERTEX_INPUT_RATE_VERTEX) vertexOffset = vertexIndex * bindingDesc.stride; else vertexOffset = instanceIndex * bindingDesc.stride; attribAddress = bufferBindingAddress + vertexOffset + attribDesc.offset;
For each attribute, raw data is extracted starting at attribAddress
and is
converted from the VkVertexInputAttributeDescription
’s format
to
either to floating-point, unsigned integer, or signed integer based on the
base type of the format; the base type of the format must match the base
type of the input variable in the shader.
If format
is a packed format, attribAddress
must be a multiple of
the size in bytes of the whole attribute data type as described in
Packed Formats.
Otherwise, attribAddress
must be a multiple of the size in bytes of the
component type indicated by format
(see Formats).
If the format does not include G, B, or A components, then those are filled
with (0,0,1) as needed (using either 1.0f or integer 1 based on the
format) for attributes that are not 64-bit data types.
The number of components in the vertex shader input variable need not
exactly match the number of components in the format.
If the vertex shader has fewer components, the extra components are
discarded.