652 lines
30 KiB
Plaintext
652 lines
30 KiB
Plaintext
// Copyright (c) 2015-2019 Khronos Group. This work is licensed under a
|
|
// Creative Commons Attribution 4.0 International License; see
|
|
// http://creativecommons.org/licenses/by/4.0/
|
|
|
|
[[fxvertex]]
|
|
= Fixed-Function Vertex Processing
|
|
|
|
Vertex fetching is controlled via configurable state, as a logically
|
|
distinct graphics pipeline stage.
|
|
|
|
|
|
[[fxvertex-attrib]]
|
|
== Vertex Attributes
|
|
|
|
Vertex shaders can: define input variables, which receive _vertex attribute_
|
|
data transferred from one or more sname:VkBuffer(s) by drawing commands.
|
|
Vertex shader input variables are bound to buffers via an indirect binding
|
|
where the vertex shader associates a _vertex input attribute_ number with
|
|
each variable, vertex input attributes are associated to _vertex input
|
|
bindings_ on a per-pipeline basis, and vertex input bindings are associated
|
|
with specific buffers on a per-draw basis via the
|
|
fname:vkCmdBindVertexBuffers command.
|
|
Vertex input attribute and vertex input binding descriptions also contain
|
|
format information controlling how data is extracted from buffer memory and
|
|
converted to the format expected by the vertex shader.
|
|
|
|
There are sname:VkPhysicalDeviceLimits::pname:maxVertexInputAttributes
|
|
number of vertex input attributes and
|
|
sname:VkPhysicalDeviceLimits::pname:maxVertexInputBindings number of vertex
|
|
input bindings (each referred to by zero-based indices), where there are at
|
|
least as many vertex input attributes as there are vertex input bindings.
|
|
Applications can: store multiple vertex input attributes interleaved in a
|
|
single buffer, and use a single vertex input binding to access those
|
|
attributes.
|
|
|
|
In GLSL, vertex shaders associate input variables with a vertex input
|
|
attribute number using the code:location layout qualifier.
|
|
The code:component layout qualifier associates components of a vertex shader
|
|
input variable with components of a vertex input attribute.
|
|
|
|
.GLSL example
|
|
[source,glsl]
|
|
---------------------------------------------------
|
|
// Assign location M to variableName
|
|
layout (location=M, component=2) in vec2 variableName;
|
|
|
|
// Assign locations [N,N+L) to the array elements of variableNameArray
|
|
layout (location=N) in vec4 variableNameArray[L];
|
|
---------------------------------------------------
|
|
|
|
In SPIR-V, vertex shaders associate input variables with a vertex input
|
|
attribute number using the code:Location decoration.
|
|
The code:Component decoration associates components of a vertex shader input
|
|
variable with components of a vertex input attribute.
|
|
The code:Location and code:Component decorations are specified via the
|
|
code:OpDecorate instruction.
|
|
|
|
.SPIR-V example
|
|
[source,spirv]
|
|
---------------------------------------------------
|
|
...
|
|
%1 = OpExtInstImport "GLSL.std.450"
|
|
...
|
|
OpName %9 "variableName"
|
|
OpName %15 "variableNameArray"
|
|
OpDecorate %18 BuiltIn VertexIndex
|
|
OpDecorate %19 BuiltIn InstanceIndex
|
|
OpDecorate %9 Location M
|
|
OpDecorate %9 Component 2
|
|
OpDecorate %15 Location N
|
|
...
|
|
%2 = OpTypeVoid
|
|
%3 = OpTypeFunction %2
|
|
%6 = OpTypeFloat 32
|
|
%7 = OpTypeVector %6 2
|
|
%8 = OpTypePointer Input %7
|
|
%9 = OpVariable %8 Input
|
|
%10 = OpTypeVector %6 4
|
|
%11 = OpTypeInt 32 0
|
|
%12 = OpConstant %11 L
|
|
%13 = OpTypeArray %10 %12
|
|
%14 = OpTypePointer Input %13
|
|
%15 = OpVariable %14 Input
|
|
...
|
|
---------------------------------------------------
|
|
|
|
|
|
[[fxvertex-attrib-location]]
|
|
=== Attribute Location and Component Assignment
|
|
|
|
Vertex shaders allow code:Location and code:Component decorations on input
|
|
variable declarations.
|
|
The code:Location decoration specifies which vertex input attribute is used
|
|
to read and interpret the data that a variable will consume.
|
|
The code:Component decoration allows the location to be more finely
|
|
specified for scalars and vectors, down to the individual components within
|
|
a location that are consumed.
|
|
The components within a location are 0, 1, 2, and 3.
|
|
A variable starting at component N will consume components N, N+1, N+2, ...
|
|
up through its size.
|
|
For single precision types, it is invalid if the sequence of components gets
|
|
larger than 3.
|
|
|
|
When a vertex shader input variable declared using a scalar or vector 32-bit
|
|
data type is assigned a location, its value(s) are taken from the components
|
|
of the input attribute specified with the corresponding
|
|
sname:VkVertexInputAttributeDescription::pname:location.
|
|
The components used depend on the type of variable and the code:Component
|
|
decoration specified in the variable declaration, as identified in
|
|
<<fxvertex-attrib-components>>.
|
|
Any 32-bit scalar or vector input will consume a single location.
|
|
For 32-bit data types, missing components are filled in with default values
|
|
as described <<fxvertex-input-extraction,below>>.
|
|
|
|
|
|
[[fxvertex-attrib-components]]
|
|
.Input attribute components accessed by 32-bit input variables
|
|
[width="65%",cols="<5,<3,<3",options="header"]
|
|
|====
|
|
| 32-bit data type | code:Component decoration | Components consumed
|
|
| scalar | 0 or unspecified | (x, o, o, o)
|
|
| scalar | 1 | (o, y, o, o)
|
|
| scalar | 2 | (o, o, z, o)
|
|
| scalar | 3 | (o, o, o, w)
|
|
| two-component vector | 0 or unspecified | (x, y, o, o)
|
|
| two-component vector | 1 | (o, y, z, o)
|
|
| two-component vector | 2 | (o, o, z, w)
|
|
| three-component vector| 0 or unspecified | (x, y, z, o)
|
|
| three-component vector| 1 | (o, y, z, w)
|
|
| four-component vector | 0 or unspecified | (x, y, z, w)
|
|
|====
|
|
|
|
Components indicated by "`o`" are available for use by other input variables
|
|
which are sourced from the same attribute, and if used, are either filled
|
|
with the corresponding component from the input format (if present), or the
|
|
default value.
|
|
|
|
When a vertex shader input variable declared using a 32-bit floating point
|
|
matrix type is assigned a location _i_, its values are taken from
|
|
consecutive input attributes starting with the corresponding
|
|
sname:VkVertexInputAttributeDescription::pname:location.
|
|
Such matrices are treated as an array of column vectors with values taken
|
|
from the input attributes identified in <<fxvertex-attrib-matrix>>.
|
|
The sname:VkVertexInputAttributeDescription::pname:format must: be specified
|
|
with a elink:VkFormat that corresponds to the appropriate type of column
|
|
vector.
|
|
The code:Component decoration must: not be used with matrix types.
|
|
|
|
[[fxvertex-attrib-matrix]]
|
|
.Input attributes accessed by 32-bit input matrix variables
|
|
[width="100%",cols="<10%,<24%,<21%,<45%",options="header"]
|
|
|====
|
|
| Data type | Column vector type | Locations consumed | Components consumed
|
|
| mat2 | two-component vector | i, i+1 | (x, y, o, o), (x, y, o, o)
|
|
| mat2x3 | three-component vector | i, i+1 | (x, y, z, o), (x, y, z, o)
|
|
| mat2x4 | four-component vector | i, i+1 | (x, y, z, w), (x, y, z, w)
|
|
| mat3x2 | two-component vector | i, i+1, i+2 | (x, y, o, o), (x, y, o, o), (x, y, o, o)
|
|
| mat3 | three-component vector | i, i+1, i+2 | (x, y, z, o), (x, y, z, o), (x, y, z, o)
|
|
| mat3x4 | four-component vector | i, i+1, i+2 | (x, y, z, w), (x, y, z, w), (x, y, z, w)
|
|
| mat4x2 | two-component vector | i, i+1, i+2, i+3 | (x, y, o, o), (x, y, o, o), (x, y, o, o), (x, y, o, o)
|
|
| mat4x3 | three-component vector | i, i+1, i+2, i+3 | (x, y, z, o), (x, y, z, o), (x, y, z, o), (x, y, z, o)
|
|
| mat4 | four-component vector | i, i+1, i+2, i+3 | (x, y, z, w), (x, y, z, w), (x, y, z, w), (x, y, z, w)
|
|
|====
|
|
|
|
Components indicated by "`o`" are available for use by other input variables
|
|
which are sourced from the same attribute, and if used, are either filled
|
|
with the corresponding component from the input (if present), or the default
|
|
value.
|
|
|
|
When a vertex shader input variable declared using a scalar or vector 64-bit
|
|
data type is assigned a location _i_, its values are taken from consecutive
|
|
input attributes starting with the corresponding
|
|
sname:VkVertexInputAttributeDescription::pname:location.
|
|
The locations and components used depend on the type of variable and the
|
|
code:Component decoration specified in the variable declaration, as
|
|
identified in <<fxvertex-attrib-double>>.
|
|
For 64-bit data types, no default attribute values are provided.
|
|
Input variables must: not use more components than provided by the
|
|
attribute.
|
|
Input attributes which have one- or two-component 64-bit formats will
|
|
consume a single location.
|
|
Input attributes which have three- or four-component 64-bit formats will
|
|
consume two consecutive locations.
|
|
A 64-bit scalar data type will consume two components, and a 64-bit
|
|
two-component vector data type will consume all four components available
|
|
within a location.
|
|
A three- or four-component 64-bit data type must: not specify a component.
|
|
A three-component 64-bit data type will consume all four components of the
|
|
first location and components 0 and 1 of the second location.
|
|
This leaves components 2 and 3 available for other component-qualified
|
|
declarations.
|
|
A four-component 64-bit data type will consume all four components of the
|
|
first location and all four components of the second location.
|
|
It is invalid for a scalar or two-component 64-bit data type to specify a
|
|
component of 1 or 3.
|
|
|
|
[[fxvertex-attrib-double]]
|
|
.Input attribute locations and components accessed by 64-bit input variables
|
|
[width="100%",cols="<18%,^12%,<25%,^14%,^18%,<13%",options="header"]
|
|
|====
|
|
^.^| Input format | Locations consumed
|
|
^.^| 64-bit data type |code:Location decoration |code:Component decoration ^| 32-bit components consumed
|
|
| R64 | i
|
|
| scalar | i | 0 or unspecified | (x, y, -, -)
|
|
.3+<.^| R64G64 .3+^.^| i
|
|
| scalar | i | 0 or unspecified | (x, y, o, o)
|
|
| scalar | i | 2 | (o, o, z, w)
|
|
| two-component vector | i | 0 or unspecified | (x, y, z, w)
|
|
.5+<.^| R64G64B64 .5+^.^| i, i+1
|
|
| scalar | i | 0 or unspecified | (x, y, o, o), (o, o, -, -)
|
|
| scalar | i | 2 | (o, o, z, w), (o, o, -, -)
|
|
| scalar | i+1 | 0 or unspecified | (o, o, o, o), (x, y, -, -)
|
|
| two-component vector | i | 0 or unspecified | (x, y, z, w), (o, o, -, -)
|
|
| three-component vector | i | unspecified | (x, y, z, w), (x, y, -, -)
|
|
.8+<.^| R64G64B64A64 .8+^.^| i, i+1
|
|
| scalar | i | 0 or unspecified | (x, y, o, o), (o, o, o, o)
|
|
| scalar | i | 2 | (o, o, z, w), (o, o, o, o)
|
|
| scalar | i+1 | 0 or unspecified | (o, o, o, o), (x, y, o, o)
|
|
| scalar | i+1 | 2 | (o, o, o, o), (o, o, z, w)
|
|
| two-component vector | i | 0 or unspecified | (x, y, z, w), (o, o, o, o)
|
|
| two-component vector | i+1 | 0 or unspecified | (o, o, o, o), (x, y, z, w)
|
|
| three-component vector | i | unspecified | (x, y, z, w), (x, y, o, o)
|
|
| four-component vector | i | unspecified | (x, y, z, w), (x, y, z, w)
|
|
|====
|
|
|
|
Components indicated by "`o`" are available for use by other input variables
|
|
which are sourced from the same attribute.
|
|
Components indicated by "`-`" are not available for input variables as there
|
|
are no default values provided for 64-bit data types, and there is no data
|
|
provided by the input format.
|
|
|
|
When a vertex shader input variable declared using a 64-bit floating-point
|
|
matrix type is assigned a location _i_, its values are taken from
|
|
consecutive input attribute locations.
|
|
Such matrices are treated as an array of column vectors with values taken
|
|
from the input attributes as shown in <<fxvertex-attrib-double>>.
|
|
Each column vector starts at the location immediately following the last
|
|
location of the previous column vector.
|
|
The number of attributes and components assigned to each matrix is
|
|
determined by the matrix dimensions and ranges from two to eight locations.
|
|
|
|
When a vertex shader input variable declared using an array type is assigned
|
|
a location, its values are taken from consecutive input attributes starting
|
|
with the corresponding
|
|
sname:VkVertexInputAttributeDescription::pname:location.
|
|
The number of attributes and components assigned to each element are
|
|
determined according to the data type of the array elements and
|
|
code:Component decoration (if any) specified in the declaration of the
|
|
array, as described above.
|
|
Each element of the array, in order, is assigned to consecutive locations,
|
|
but all at the same specified component within each location.
|
|
|
|
Only input variables declared with the data types and component decorations
|
|
as specified above are supported.
|
|
_Location aliasing_ is causing two variables to have the same location
|
|
number.
|
|
_Component aliasing_ is assigning the same (or overlapping) component number
|
|
for two location aliases.
|
|
Location aliasing is allowed only if it does not cause component aliasing.
|
|
Further, when location aliasing, the aliases sharing the location must: all
|
|
have the same SPIR-V floating-point component type or all have the same
|
|
width integer-type components.
|
|
|
|
|
|
[[fxvertex-input]]
|
|
== Vertex Input Description
|
|
|
|
Applications specify vertex input attribute and vertex input binding
|
|
descriptions as part of graphics pipeline creation.
|
|
The slink:VkGraphicsPipelineCreateInfo::pname:pVertexInputState points to a
|
|
structure of type sname:VkPipelineVertexInputStateCreateInfo.
|
|
|
|
[open,refpage='VkPipelineVertexInputStateCreateInfo',desc='Structure specifying parameters of a newly created pipeline vertex input state',type='structs']
|
|
--
|
|
|
|
The sname:VkPipelineVertexInputStateCreateInfo structure is defined as:
|
|
|
|
include::../api/structs/VkPipelineVertexInputStateCreateInfo.txt[]
|
|
|
|
* pname:sType is the type of this structure.
|
|
* pname:pNext is `NULL` or a pointer to an extension-specific structure.
|
|
* pname:flags is reserved for future use.
|
|
* pname:vertexBindingDescriptionCount is the number of vertex binding
|
|
descriptions provided in pname:pVertexBindingDescriptions.
|
|
* pname:pVertexBindingDescriptions is a pointer to an array of
|
|
sname:VkVertexInputBindingDescription structures.
|
|
* pname:vertexAttributeDescriptionCount is the number of vertex attribute
|
|
descriptions provided in pname:pVertexAttributeDescriptions.
|
|
* pname:pVertexAttributeDescriptions is a pointer to an array of
|
|
sname:VkVertexInputAttributeDescription structures.
|
|
|
|
.Valid Usage
|
|
****
|
|
* [[VUID-VkPipelineVertexInputStateCreateInfo-vertexBindingDescriptionCount-00613]]
|
|
pname:vertexBindingDescriptionCount must: be less than or equal to
|
|
sname:VkPhysicalDeviceLimits::pname:maxVertexInputBindings
|
|
* [[VUID-VkPipelineVertexInputStateCreateInfo-vertexAttributeDescriptionCount-00614]]
|
|
pname:vertexAttributeDescriptionCount must: be less than or equal to
|
|
sname:VkPhysicalDeviceLimits::pname:maxVertexInputAttributes
|
|
* [[VUID-VkPipelineVertexInputStateCreateInfo-binding-00615]]
|
|
For every pname:binding specified by each element of
|
|
pname:pVertexAttributeDescriptions, a
|
|
sname:VkVertexInputBindingDescription must: exist in
|
|
pname:pVertexBindingDescriptions with the same value of pname:binding
|
|
* [[VUID-VkPipelineVertexInputStateCreateInfo-pVertexBindingDescriptions-00616]]
|
|
All elements of pname:pVertexBindingDescriptions must: describe distinct
|
|
binding numbers
|
|
* [[VUID-VkPipelineVertexInputStateCreateInfo-pVertexAttributeDescriptions-00617]]
|
|
All elements of pname:pVertexAttributeDescriptions must: describe
|
|
distinct attribute locations
|
|
****
|
|
|
|
include::../validity/structs/VkPipelineVertexInputStateCreateInfo.txt[]
|
|
--
|
|
|
|
[open,refpage='VkPipelineVertexInputStateCreateFlags',desc='Reserved for future use',type='flags']
|
|
--
|
|
include::../api/flags/VkPipelineVertexInputStateCreateFlags.txt[]
|
|
|
|
tname:VkPipelineVertexInputStateCreateFlags is a bitmask type for setting a
|
|
mask, but is currently reserved for future use.
|
|
--
|
|
|
|
Each vertex input binding is specified by an instance of the
|
|
sname:VkVertexInputBindingDescription structure.
|
|
|
|
[open,refpage='VkVertexInputBindingDescription',desc='Structure specifying vertex input binding description',type='structs']
|
|
--
|
|
|
|
The sname:VkVertexInputBindingDescription structure is defined as:
|
|
|
|
include::../api/structs/VkVertexInputBindingDescription.txt[]
|
|
|
|
* pname:binding is the binding number that this structure describes.
|
|
* pname:stride is the distance in bytes between two consecutive elements
|
|
within the buffer.
|
|
* pname:inputRate is a elink:VkVertexInputRate value specifying whether
|
|
vertex attribute addressing is a function of the vertex index or of the
|
|
instance index.
|
|
|
|
.Valid Usage
|
|
****
|
|
* [[VUID-VkVertexInputBindingDescription-binding-00618]]
|
|
pname:binding must: be less than
|
|
sname:VkPhysicalDeviceLimits::pname:maxVertexInputBindings
|
|
* [[VUID-VkVertexInputBindingDescription-stride-00619]]
|
|
pname:stride must: be less than or equal to
|
|
sname:VkPhysicalDeviceLimits::pname:maxVertexInputBindingStride
|
|
****
|
|
|
|
include::../validity/structs/VkVertexInputBindingDescription.txt[]
|
|
--
|
|
|
|
[open,refpage='VkVertexInputRate',desc='Specify rate at which vertex attributes are pulled from buffers',type='enums']
|
|
--
|
|
|
|
Possible values of slink:VkVertexInputBindingDescription::pname:inputRate,
|
|
specifying the rate at which vertex attributes are pulled from buffers, are:
|
|
|
|
include::../api/enums/VkVertexInputRate.txt[]
|
|
|
|
* ename:VK_VERTEX_INPUT_RATE_VERTEX specifies that vertex attribute
|
|
addressing is a function of the vertex index.
|
|
* ename:VK_VERTEX_INPUT_RATE_INSTANCE specifies that vertex attribute
|
|
addressing is a function of the instance index.
|
|
|
|
--
|
|
|
|
[open,refpage='VkVertexInputAttributeDescription',desc='Structure specifying vertex input attribute description',type='structs']
|
|
--
|
|
|
|
Each vertex input attribute is specified by an instance of the
|
|
sname:VkVertexInputAttributeDescription structure.
|
|
|
|
The sname:VkVertexInputAttributeDescription structure is defined as:
|
|
|
|
include::../api/structs/VkVertexInputAttributeDescription.txt[]
|
|
|
|
* pname:location is the shader binding location number for this attribute.
|
|
* pname:binding is the binding number which this attribute takes its data
|
|
from.
|
|
* pname:format is the size and type of the vertex attribute data.
|
|
* pname:offset is a byte offset of this attribute relative to the start of
|
|
an element in the vertex input binding.
|
|
|
|
.Valid Usage
|
|
****
|
|
* [[VUID-VkVertexInputAttributeDescription-location-00620]]
|
|
pname:location must: be less than
|
|
sname:VkPhysicalDeviceLimits::pname:maxVertexInputAttributes
|
|
* [[VUID-VkVertexInputAttributeDescription-binding-00621]]
|
|
pname:binding must: be less than
|
|
sname:VkPhysicalDeviceLimits::pname:maxVertexInputBindings
|
|
* [[VUID-VkVertexInputAttributeDescription-offset-00622]]
|
|
pname:offset must: be less than or equal to
|
|
sname:VkPhysicalDeviceLimits::pname:maxVertexInputAttributeOffset
|
|
* [[VUID-VkVertexInputAttributeDescription-format-00623]]
|
|
pname:format must: be allowed as a vertex buffer format, as specified by
|
|
the ename:VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT flag in
|
|
sname:VkFormatProperties::pname:bufferFeatures returned by
|
|
fname:vkGetPhysicalDeviceFormatProperties
|
|
****
|
|
|
|
include::../validity/structs/VkVertexInputAttributeDescription.txt[]
|
|
--
|
|
|
|
[open,refpage='vkCmdBindVertexBuffers',desc='Bind vertex buffers to a command buffer',type='protos']
|
|
--
|
|
|
|
To bind vertex buffers to a command buffer for use in subsequent draw
|
|
commands, call:
|
|
|
|
include::../api/protos/vkCmdBindVertexBuffers.txt[]
|
|
|
|
* pname:commandBuffer is the command buffer into which the command is
|
|
recorded.
|
|
* pname:firstBinding is the index of the first vertex input binding whose
|
|
state is updated by the command.
|
|
* pname:bindingCount is the number of vertex input bindings whose state is
|
|
updated by the command.
|
|
* pname:pBuffers is a pointer to an array of buffer handles.
|
|
* pname:pOffsets is a pointer to an array of buffer offsets.
|
|
|
|
The values taken from elements [eq]#i# of pname:pBuffers and pname:pOffsets
|
|
replace the current state for the vertex input binding
|
|
[eq]#pname:firstBinding {plus} i#, for [eq]#i# in [eq]#[0,
|
|
pname:bindingCount)#.
|
|
The vertex input binding is updated to start at the offset indicated by
|
|
pname:pOffsets[i] from the start of the buffer pname: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.
|
|
|
|
.Valid Usage
|
|
****
|
|
* [[VUID-vkCmdBindVertexBuffers-firstBinding-00624]]
|
|
pname:firstBinding must: be less than
|
|
sname:VkPhysicalDeviceLimits::pname:maxVertexInputBindings
|
|
* [[VUID-vkCmdBindVertexBuffers-firstBinding-00625]]
|
|
The sum of pname:firstBinding and pname:bindingCount must: be less than
|
|
or equal to sname:VkPhysicalDeviceLimits::pname:maxVertexInputBindings
|
|
* [[VUID-vkCmdBindVertexBuffers-pOffsets-00626]]
|
|
All elements of pname:pOffsets must: be less than the size of the
|
|
corresponding element in pname:pBuffers
|
|
* [[VUID-vkCmdBindVertexBuffers-pBuffers-00627]]
|
|
All elements of pname:pBuffers must: have been created with the
|
|
ename:VK_BUFFER_USAGE_VERTEX_BUFFER_BIT flag
|
|
* [[VUID-vkCmdBindVertexBuffers-pBuffers-00628]]
|
|
Each element of pname:pBuffers that is non-sparse must: be bound
|
|
completely and contiguously to a single sname:VkDeviceMemory object
|
|
****
|
|
|
|
include::../validity/protos/vkCmdBindVertexBuffers.txt[]
|
|
--
|
|
|
|
ifdef::VK_EXT_vertex_attribute_divisor[]
|
|
|
|
== Vertex Attribute Divisor in Instanced Rendering
|
|
|
|
[open,refpage='VkPipelineVertexInputDivisorStateCreateInfoEXT',desc='Structure specifying vertex attributes assignment during instanced rendering',type='structs']
|
|
--
|
|
|
|
If
|
|
<<features-features-vertexAttributeInstanceRateDivisor,pname:vertexAttributeInstanceRateDivisor>>
|
|
feature is enabled and the pname:pNext chain of
|
|
slink:VkPipelineVertexInputStateCreateInfo includes a
|
|
sname:VkPipelineVertexInputDivisorStateCreateInfoEXT structure, then that
|
|
structure controls how vertex attributes are assigned to an instance when
|
|
instanced rendering is enabled.
|
|
|
|
The sname:VkPipelineVertexInputDivisorStateCreateInfoEXT structure is
|
|
defined as:
|
|
|
|
include::../api/structs/VkPipelineVertexInputDivisorStateCreateInfoEXT.txt[]
|
|
|
|
* pname:sType is the type of this structure
|
|
* pname:pNext is `NULL` or a pointer to an extension-specific structure
|
|
* pname:vertexBindingDivisorCount is the number of elements in the
|
|
pname:pVertexBindingDivisors array.
|
|
* pname:pVertexBindingDivisors is a pointer to an array of
|
|
sname:VkVertexInputBindingDivisorDescriptionEXT structures, which
|
|
specifies the divisor value for each binding.
|
|
|
|
include::../validity/structs/VkPipelineVertexInputDivisorStateCreateInfoEXT.txt[]
|
|
--
|
|
|
|
[open,refpage='VkVertexInputBindingDivisorDescriptionEXT',desc='Structure specifying a divisor used in instanced rendering',type='structs']
|
|
--
|
|
The individual divisor values per binding are specified using the
|
|
sname:VkVertexInputBindingDivisorDescriptionEXT structure which is defined
|
|
as:
|
|
|
|
include::../api/structs/VkVertexInputBindingDivisorDescriptionEXT.txt[]
|
|
|
|
* pname:binding is the binding number for which the divisor is specified.
|
|
* pname:divisor is the number of successive instances that will use the
|
|
same value of the vertex attribute when instanced rendering is enabled.
|
|
For example, if the divisor is N, the same vertex attribute will applied
|
|
to N successive instances before moving on to the next vertex attribute.
|
|
The maximum value of divisor is implementation dependent and can be
|
|
queried using
|
|
sname:VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT::pname:maxVertexAttribDivisor.
|
|
A value of `0` can: be used for the divisor if the
|
|
<<features-features-vertexAttributeInstanceRateZeroDivisor,pname:vertexAttributeInstanceRateZeroDivisor>>
|
|
feature is enabled.
|
|
In this case, the same vertex attribute will be applied to all
|
|
instances.
|
|
|
|
If this structure is not used to define a divisor value for an attribute
|
|
then the divisor has a logical default value of 1.
|
|
|
|
.Valid Usage
|
|
****
|
|
* [[VUID-VkVertexInputBindingDivisorDescriptionEXT-binding-01869]]
|
|
pname:binding must: be less than
|
|
sname:VkPhysicalDeviceLimits::pname:maxVertexInputBindings
|
|
* [[VUID-VkVertexInputBindingDivisorDescriptionEXT-vertexAttributeInstanceRateZeroDivisor-02228]]
|
|
If the pname:vertexAttributeInstanceRateZeroDivisor feature is not
|
|
enabled, pname:divisor must: not be `0`
|
|
* [[VUID-VkVertexInputBindingDivisorDescriptionEXT-vertexAttributeInstanceRateDivisor-02229]]
|
|
If the pname:vertexAttributeInstanceRateDivisor feature is not enabled,
|
|
pname:divisor must: be `1`
|
|
* [[VUID-VkVertexInputBindingDivisorDescriptionEXT-divisor-01870]]
|
|
pname:divisor must: be a value between `0` and
|
|
sname:VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT::pname:maxVertexAttribDivisor,
|
|
inclusive.
|
|
* [[VUID-VkVertexInputBindingDivisorDescriptionEXT-inputRate-01871]]
|
|
slink:VkVertexInputBindingDescription::pname:inputRate must: be of type
|
|
ename:VK_VERTEX_INPUT_RATE_INSTANCE for this pname:binding.
|
|
****
|
|
|
|
include::../validity/structs/VkVertexInputBindingDivisorDescriptionEXT.txt[]
|
|
--
|
|
|
|
endif::VK_EXT_vertex_attribute_divisor[]
|
|
|
|
The address of each attribute for each code:vertexIndex and
|
|
code:instanceIndex is calculated as follows:
|
|
|
|
* Let code:attribDesc be the member of
|
|
sname:VkPipelineVertexInputStateCreateInfo::pname:pVertexAttributeDescriptions
|
|
with sname:VkVertexInputAttributeDescription::pname:location equal to
|
|
the vertex input attribute number.
|
|
* Let code:bindingDesc be the member of
|
|
sname:VkPipelineVertexInputStateCreateInfo::pname:pVertexBindingDescriptions
|
|
with sname:VkVertexInputAttributeDescription::pname:binding equal to
|
|
code:attribDesc.binding.
|
|
* Let code:vertexIndex be the index of the vertex within the draw (a value
|
|
between pname:firstVertex and pname:firstVertex+pname:vertexCount for
|
|
fname:vkCmdDraw, or a value taken from the index buffer for
|
|
fname:vkCmdDrawIndexed), and let code:instanceIndex be the instance
|
|
number of the draw (a value between pname:firstInstance and
|
|
pname:firstInstance+pname:instanceCount).
|
|
ifdef::VK_EXT_vertex_attribute_divisor[]
|
|
* Let code:divisor be the member of
|
|
sname:VkPipelineVertexInputDivisorStateCreateInfoEXT::pname:pVertexBindingDivisors
|
|
with sname:VkVertexInputBindingDivisorDescriptionEXT::pname:binding
|
|
equal to code:attribDesc.binding.
|
|
endif::VK_EXT_vertex_attribute_divisor[]
|
|
|
|
[source,c]
|
|
---------------------------------------------------
|
|
bufferBindingAddress = buffer[binding].baseAddress + offset[binding];
|
|
|
|
if (bindingDesc.inputRate == VK_VERTEX_INPUT_RATE_VERTEX)
|
|
vertexOffset = vertexIndex * bindingDesc.stride;
|
|
else
|
|
ifndef::VK_EXT_vertex_attribute_divisor[]
|
|
vertexOffset = instanceIndex * bindingDesc.stride;
|
|
endif::VK_EXT_vertex_attribute_divisor[]
|
|
ifdef::VK_EXT_vertex_attribute_divisor[]
|
|
if (divisor == 0)
|
|
vertexOffset = firstInstance * bindingDesc.stride;
|
|
else
|
|
vertexOffset = (firstInstance + ((instanceIndex - firstInstance) / divisor)) * bindingDesc.stride;
|
|
endif::VK_EXT_vertex_attribute_divisor[]
|
|
|
|
attribAddress = bufferBindingAddress + vertexOffset + attribDesc.offset;
|
|
---------------------------------------------------
|
|
|
|
[[fxvertex-input-extraction]]
|
|
For each attribute, raw data is extracted starting at `attribAddress` and is
|
|
converted from the sname:VkVertexInputAttributeDescription's pname: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 pname:format is a packed format, `attribAddress` must: be a multiple of
|
|
the size in bytes of the whole attribute data type as described in
|
|
<<features-formats-packed,Packed Formats>>.
|
|
Otherwise, `attribAddress` must: be a multiple of the size in bytes of the
|
|
component type indicated by pname:format (see <<features-formats,Formats>>).
|
|
If the format does not include G, B, or A components, then those are filled
|
|
with [eq]#(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.
|
|
|
|
[[fxvertex-example]]
|
|
== Example
|
|
|
|
To create a graphics pipeline that uses the following vertex description:
|
|
|
|
[source,c++]
|
|
---------------------------------------------------
|
|
struct Vertex
|
|
{
|
|
float x, y, z, w;
|
|
uint8_t u, v;
|
|
};
|
|
---------------------------------------------------
|
|
|
|
The application could use the following set of structures:
|
|
|
|
[source,c++]
|
|
---------------------------------------------------
|
|
const VkVertexInputBindingDescription binding =
|
|
{
|
|
0, // binding
|
|
sizeof(Vertex), // stride
|
|
VK_VERTEX_INPUT_RATE_VERTEX // inputRate
|
|
};
|
|
|
|
const VkVertexInputAttributeDescription attributes[] =
|
|
{
|
|
{
|
|
0, // location
|
|
binding.binding, // binding
|
|
VK_FORMAT_R32G32B32A32_SFLOAT, // format
|
|
0 // offset
|
|
},
|
|
{
|
|
1, // location
|
|
binding.binding, // binding
|
|
VK_FORMAT_R8G8_UNORM, // format
|
|
4 * sizeof(float) // offset
|
|
}
|
|
};
|
|
|
|
const VkPipelineVertexInputStateCreateInfo viInfo =
|
|
{
|
|
VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO, // sType
|
|
NULL, // pNext
|
|
0, // flags
|
|
1, // vertexBindingDescriptionCount
|
|
&binding, // pVertexBindingDescriptions
|
|
2, // vertexAttributeDescriptionCount
|
|
&attributes[0] // pVertexAttributeDescriptions
|
|
};
|
|
---------------------------------------------------
|