着色器接口
当创建管线时,在相应的 VkPipelineCreateInfo
结构中指定的一组着色器会在多个不同的接口中隐式链接。
本章描述了一组 SPIR-V 修饰符的有效用法。任何其他使用这些修饰符的行为都是无效的,但当使用 SPIR-V 1.4 及更早版本时除外:Block
、BufferBlock
、Offset
、ArrayStride
和 MatrixStride
也可以修饰 Private
和 Function
存储类中的变量使用的类型和类型成员。
在本章中,将引用 SPIR-V 术语,例如 |
着色器输入和输出接口
当管线中存在多个阶段时,一个阶段的输出会与下一个阶段的输入形成接口。当此类接口涉及着色器时,着色器输出会与下一阶段的输入进行匹配,并且着色器输入会与前一阶段的输出进行匹配。
所有形成着色器输入和输出接口的变量都列为 OpEntryPoint
指令的操作数,并在 SPIR-V 模块中使用 Input
或 Output
存储类分别声明。无论连续着色器阶段之间存在任何非着色器阶段,这些通常会形成连续着色器阶段之间的接口。
有两种变量可以在着色器阶段之间匹配:内置变量和用户定义变量。每个类都有不同的匹配标准集。
在着色器写入 Output
变量或在声明变量时使用 Initializer
操作数之前,着色器阶段的 Output
变量具有未定义的值。
内置接口块
满足以下要求的着色器内置变量定义了内置接口块。它们必须
-
被显式声明(没有隐式内置),
-
用
BuiltIn
修饰符标识, -
按照内置变量部分中的描述形成对象类型,并且
-
在顶层成员为内置的块中声明。
每个着色器在每个接口中必须只有一个内置接口块,除了网格输出接口,其中必须最多一个用 PerPrimitiveEXT
修饰符修饰的内置接口块和最多一个没有此修饰符的内置接口块。
内置变量必须没有任何 Location
或 Component
修饰符。
用户定义变量接口
由 OpEntryPoint
列出的具有 Input
或 Output
存储类的非内置变量形成了用户定义变量接口。这些必须具有数值类型,或递归地,此类类型的复合类型。如果实现支持storageInputOutput16
,则组件的宽度可以为 16 位。这些变量必须用 Location
修饰符标识,并且可以也用 Component
修饰符标识。
接口匹配
如果以下条件均满足,则给定着色器阶段中的输出变量、块或结构成员会与后续着色器阶段中的输入变量、块或结构成员具有接口匹配
-
它们具有等效的修饰符,除了
-
XfbBuffer
、XfbStride
、Offset
和Stream
-
一个没有用
Component
修饰,而另一个用Component
的0
声明 -
如果一个是输入变量,而另一个是输出变量,则
RelaxedPrecision
-
-
它们的类型匹配如下
-
如果输入在细分控制或几何着色器中声明为
OpTypeArray
,其Element
Type
等效于输出的OpType*
声明,并且两者都不是结构成员;或 -
如果启用了
maintenance4
功能,则将它们声明为OpTypeVector
变量,并且输出的Component
Count
值高于输入的,但具有相同的Component
Type
;或 -
如果输出在网格着色器中声明为
OpTypeArray
,且其Element
Type
等效于输入的OpType*
声明,并且两者都不是结构成员;或者 -
如果输入使用
PerVertexKHR
修饰,并且在片段着色器中声明为OpTypeArray
,且其Element
Type
等效于输出的OpType*
声明,并且输入和输出都不是结构成员;或者 -
如果在任何其他情况下,它们使用等效的
OpType*
声明进行声明。
-
-
如果两者都是结构,并且每个成员都有一个接口匹配。
上面的“结构”一词指的是具有 |
如果管道编译为单独的图形管道库,并且不支持 graphicsPipelineLibraryIndependentInterpolationDecoration
限制,则如果最后一个光栅化前着色器阶段和片段着色器阶段之间的插值修饰不同,则不会找到匹配项。
所有输入变量和块**必须**在前一个着色器阶段中具有接口匹配,片段着色器中的内置变量除外。着色器**可以**声明并写入后续阶段未声明或读取的输出变量。
直通几何着色器的匹配规则略有不同,在直通接口匹配部分中描述。
如果前一个阶段没有写入匹配的输出变量(如上所述),则输入变量的值是**未定义的**。
位置分配
本节描述了用户定义变量的 Location
分配,以及给定的用户变量类型消耗多少 Location
插槽。 如上所述,与其他的着色器输入和输出相比,某些输入和输出具有额外的数组级别。在考虑类型消耗多少 Location
插槽之前,将从类型中删除此外部数组级别。
Location
值指定一个接口插槽,该插槽由在阶段之间传递的 32 位四分量向量组成。 Component
指定这些向量 Location
插槽内的字组件。着色器接口中仅支持宽度为 16、32 或 64 的类型。
以下类型的输入和输出消耗单个接口 Location
-
16 位标量和向量类型,以及
-
32 位标量和向量类型,以及
-
64 位标量和 2 分量向量类型。
64 位三和四分量向量消耗两个连续的 Location
插槽。
如果声明的输入或输出是大小为 *n* 的数组,并且每个元素占用 *m* 个 Location
插槽,则将从指定的 Location
开始分配 *m* × *n* 个连续的 Location
插槽。
如果声明的输入或输出是 *n* × *m* 16 位、32 位或 64 位矩阵,则将从指定的 Location
开始为其分配多个 Location
插槽。为每个矩阵分配的 Location
插槽数与 *n* 个元素的 *m* 分量向量数组相同。
具有非块结构的 OpVariable
**必须**使用 Location
修饰。
当使用结构类型(块或非块)的 OpVariable
使用 Location
修饰时,结构类型中的成员**必须**不使用 Location
修饰。 OpVariable
的成员按照声明顺序分配连续的 Location
插槽,从第一个成员开始,该成员分配来自 OpVariable
的 Location
修饰。
当声明没有 Location
修饰的块类型 OpVariable
时,其结构类型中的每个成员**必须**使用 Location
修饰。嵌套比顶级成员更深的类型**必须**不具有 Location
修饰。
块和结构成员消耗的 Location
插槽是通过以深度优先遍历实例化成员的方式应用以上规则来确定的,就好像结构或块成员被声明为相同类型的输入或输出变量一样。
在同一个 OpEntryPoint
上列为操作数的任何两个输入**必须**不分配相同的 Location
插槽和 Component
字,无论是显式还是隐式。在同一个 OpEntryPoint
上列为操作数的任何两个输出**必须**不分配相同的 Location
插槽和 Component
字,无论是显式还是隐式。
着色器输入或输出接口可用的输入和输出 Location
插槽数量是有限的,并且取决于 着色器输入和输出位置 中描述的着色器阶段。 内置接口块和用户定义变量接口中的所有变量都计入这些限制。每个有效的 Location
**必须**具有小于给定接口可用 Location
插槽数量的值,如 着色器输入和输出位置 的“可用位置”列中所指定。
着色器接口 | 可用位置 |
---|---|
顶点输入 |
|
顶点输出 |
|
细分控制输入 |
|
细分控制输出 |
|
细分评估输入 |
|
细分评估输出 |
|
几何输入 |
|
几何输出 |
|
片段输入 |
|
片段输出 |
|
网格输出 |
|
集群剔除输出 |
|
组件分配
Component
修饰允许为标量和向量更精细地指定 Location
,直到消耗的 Location
插槽内的单个 Component
字。 Location
内的 Component
字为 0、1、2 和 3。从 Component
N 开始的变量或块成员将消耗 Component
字 N、N+1、N+2、...直到其大小。对于 16 位和 32 位类型,如果此 Component
字序列大于 3,则无效。标量 64 位类型将按顺序消耗这两个 Component
字,而双分量 64 位向量类型将消耗 Location
内的所有四个可用 Component
字。三分量或四分量 64 位向量类型**必须**不指定非零 Component
修饰。三分量 64 位向量类型将消耗第一个 Location
的所有四个 Component
字和第二个 Location
的 Component
0 和 1。这为其他组件限定的声明留下了可用的 Component
2 和 3。
标量或双分量 64 位数据类型**必须**不指定 Component
修饰为 1 或 3。对于任何不是标量或向量的类型,**必须**不指定 Component
修饰。
四分量 64 位数据类型将消耗第一个 Location
的所有四个 Component
字和第二个 Location
的所有四个 Component
字。
顶点输入接口
当顶点阶段存在于管线中时,顶点着色器输入变量与顶点输入属性形成接口。顶点着色器输入变量通过 Location
和 Component
修饰符与 VkGraphicsPipelineCreateInfo 结构的 pVertexInputState
成员中指定的顶点输入属性进行匹配。
由带有 Input
存储类别的 OpEntryPoint
列出的顶点着色器输入变量构成顶点输入接口。这些变量必须使用 Location
修饰符进行标识,并且可以使用 Component
修饰符进行标识。
为了进行接口匹配:没有 Component
修饰符声明的变量被认为具有值为零的 Component
修饰符。可用的顶点输入 Location
插槽数量由 VkPhysicalDeviceLimits
结构的 maxVertexInputAttributes
成员给出。
有关详细信息,请参阅属性位置和组件分配。
所有如上声明的顶点着色器输入必须在管线中具有相应的属性和绑定。
片段输出接口
当片段阶段存在于管线中时,片段着色器输出与 渲染过程实例定义的输出附件形成接口。片段着色器输出变量通过 Location
和 Component
修饰符与指定的颜色附件进行匹配。
由带有 Output
存储类别的 OpEntryPoint
列出的片段着色器输出变量构成片段输出接口。这些变量必须使用 Location
修饰符进行标识。它们可以使用 Component
修饰符和/或 Index
修饰符进行标识。为了进行接口匹配:没有 Component
修饰符声明的变量被认为具有值为零的 Component
修饰符,而没有 Index
修饰符声明的变量被认为具有值为零的 Index
修饰符。
使用 i 的 Location
修饰符标识的片段着色器输出变量与 VkRenderingInfo::pColorAttachments
[i] 指示的颜色附件相关联。当使用渲染过程对象时,它与 VkSubpassDescription::pColorAttachments
[i] 指示的颜色附件相关联。如果启用了混合,则如混合中所述,在通过混合单元后,值被写入这些附件。位置的消耗如位置分配中所述。可用的片段输出 Location
插槽数量由 VkPhysicalDeviceLimits
结构的 maxFragmentOutputAttachments
成员给出。
如果支持 dynamicRenderingLocalRead
功能,则在使用动态渲染时可以重新映射片段输出位置。
要在渲染期间设置片段输出位置映射,请调用
// Provided by VK_VERSION_1_4
void vkCmdSetRenderingAttachmentLocations(
VkCommandBuffer commandBuffer,
const VkRenderingAttachmentLocationInfo* pLocationInfo);
或等效命令
// Provided by VK_KHR_dynamic_rendering_local_read
void vkCmdSetRenderingAttachmentLocationsKHR(
VkCommandBuffer commandBuffer,
const VkRenderingAttachmentLocationInfo* pLocationInfo);
-
commandBuffer
是将记录命令的命令缓冲区。 -
pLocationInfo
是一个 VkRenderingAttachmentLocationInfo 结构,指示新的映射。
此命令为后续绘图命令设置附件位置映射,并且必须与绑定管线提供的映射匹配(如果已绑定管线),该映射可以通过将 VkRenderingAttachmentLocationInfo 链接到 VkGraphicsPipelineCreateInfo 来设置。
在调用此命令之前,命令缓冲区状态中的映射被视为 vkCmdBeginRendering 中指定的每个颜色附件在 VkRenderingInfo::pColorAttachments
中具有与其索引相等的位置。每当调用 vkCmdBeginRendering 时,此状态都会重置。
VkRenderingAttachmentLocationInfo
结构定义为
// Provided by VK_VERSION_1_4
typedef struct VkRenderingAttachmentLocationInfo {
VkStructureType sType;
const void* pNext;
uint32_t colorAttachmentCount;
const uint32_t* pColorAttachmentLocations;
} VkRenderingAttachmentLocationInfo;
或等效结构
// Provided by VK_KHR_dynamic_rendering_local_read
typedef VkRenderingAttachmentLocationInfo VkRenderingAttachmentLocationInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
colorAttachmentCount
是pColorAttachmentLocations
中的元素数量。 -
pColorAttachmentLocations
是指向colorAttachmentCount
个uint32_t
值的数组的指针,这些值定义了颜色附件的重新映射位置。
此结构允许应用程序将颜色附件的位置重新映射到不同的片段着色器输出位置。
pColorAttachmentLocations
的每个设置为 VK_ATTACHMENT_UNUSED
的元素对于此管线将作为颜色附件不可访问;没有位置会映射到它。pColorAttachmentLocations
的每个设置为任何其他值的元素都会将指定的位置值映射到渲染过程中指定的颜色附件,其索引与 pColorAttachmentLocations
数组中的索引相对应。任何写入未映射到附件的片段输出位置的操作必须被丢弃。
如果 pColorAttachmentLocations
为 NULL
,则相当于将每个元素设置为其在数组中的索引。
此结构可以包含在 VkGraphicsPipelineCreateInfo 结构的 pNext
链中,以设置管线的此状态。如果此结构未包含在 VkGraphicsPipelineCreateInfo 的 pNext
链中,则相当于指定具有以下属性的此结构
-
colorAttachmentCount
设置为 VkPipelineRenderingCreateInfo::colorAttachmentCount
。 -
pColorAttachmentLocations
设置为NULL
。
此结构可以包含在 VkCommandBufferInheritanceInfo 结构的 pNext
链中,以指定从主命令缓冲区继承的状态。如果 VkCommandBufferInheritanceInfo::renderPass 不是 VK_NULL_HANDLE,或者 VkCommandBufferBeginInfo::flags 中未指定 VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
,则忽略此结构的成员。如果此结构未包含在 VkCommandBufferInheritanceInfo 的 pNext
链中,则相当于指定具有以下属性的此结构
-
colorAttachmentCount
设置为 VkCommandBufferInheritanceRenderingInfo::colorAttachmentCount
。 -
pColorAttachmentLocations
设置为NULL
。
当活动的片段着色器调用完成时,所有片段着色器输出的值会被复制出来,并用作混合输入或颜色附件写入。如果调用没有为它们设置值,则这些混合或颜色附件写入的输入值是未定义的。
输出变量的组件按照组件分配中所述进行分配。标识为 0、1、2 和 3 的输出 Component
字将分别定向到混合单元的 R、G、B 和 A 输入,或者如果禁用混合,则定向到输出附件。如果两个变量放置在同一个 Location
中,它们必须具有相同的底层类型(浮点型或整型)。不对应于任何片段着色器输出的 Component
字也会导致混合或颜色附件写入的未定义值。
标识为零的 Index
的片段输出被定向到与相应 Location
关联的混合单元的第一个输入。标识为一的 Index
的输出被定向到相应混合单元的第二个输入。
必须没有输出变量具有与任何其他变量(显式声明或隐含)相同的 Location
、Component
和 Index
。
片段着色器写入的输出值必须声明为 OpTypeFloat
或 OpTypeInt
,且 Width
为 32。如果支持 storageInputOutput16
,片段着色器写入的输出值可以声明为 OpTypeFloat
或 OpTypeInt
,且 Width
为 16。也允许这些类型的复合类型。如果颜色附件具有有符号或无符号的标准化定点格式,则假定颜色值为浮点数,并按照从浮点数到标准化定点数的转换中所述转换为定点数;如果颜色附件具有整数格式,则假定颜色值为整数,并转换为目标的位深度。任何无法以附件格式表示的值都是未定义的。对于任何其他附件格式,不执行任何转换。如果片段着色器写入的值的类型与相应颜色附件的格式不匹配,则这些组件的最终值是未定义的。
旧式抖动
应用程序可以通过使用 VK_SUBPASS_DESCRIPTION_ENABLE_LEGACY_DITHERING_BIT_EXT
标志来启用对子通路的颜色输出应用抖动。对于动态渲染通道中的使用,必须使用 VK_RENDERING_ENABLE_LEGACY_DITHERING_BIT_EXT
标志。在这种情况下,使用的管线必须使用 VK_PIPELINE_CREATE_2_ENABLE_LEGACY_DITHERING_BIT_EXT
创建。
当启用抖动时,实现可能通过一个 ULP 修改输出颜色值 c。此修改必须仅取决于样本的帧缓冲区坐标 (xf,yf),以及 c 的值。
抖动算法的具体细节未指定,包括算法本身,应用抖动的格式以及应用抖动的阶段。
此扩展仅供 OpenGL 模拟层使用,因此应用于子通路的抖动算法应该等效于供应商的 OpenGL 实现(如果有)。 |
片段图块图像接口
当管线中存在片元着色器阶段时,使用 Location
修饰的片元着色器瓦片图像变量会与渲染通道实例定义的颜色附件形成接口。片元着色器瓦片图像变量通过 Location
修饰与 VkRenderingInfoKHR 结构的 pColorAttachments
数组中指定的颜色附件进行匹配,该结构描述了执行片元着色器的渲染通道实例。
通过 OpEntryPoint
列出的具有 TileImageEXT
存储类和 Location
修饰的片元着色器变量构成了片元瓦片图像接口。这些变量必须声明为 OpTypeImage
类型,且 Dim
操作数为 TileImageDataEXT
。这些变量不支持 Component
修饰。
读取 Location
修饰值为 i 的瓦片图像变量会从 VkRenderingInfoKHR::pColorAttachments
的元素标识的颜色附件中读取数据,该元素的 location
等于 i。如果瓦片图像变量声明为大小为 N 的数组,它将消耗 N 个连续的瓦片图像位置,从指定的索引开始。必须不能有多个具有相同 Location
的瓦片图像变量,无论是显式声明还是由数组声明隐含的。可用瓦片图像位置的数量与 VkPhysicalDeviceLimits
结构的 maxFragmentOutputAttachments
成员给出的可用片元输出位置的数量相同。
瓦片图像变量的基本数据类型(浮点型、整型、无符号整型)必须与相应颜色附件的基本格式匹配,否则从瓦片图像变量读取的值是未定义的。
片元输入附件接口
当管线中存在片元着色器阶段时,片元着色器子通道输入与当前子通道的输入附件形成接口。片元着色器子通道输入变量通过 InputAttachmentIndex
修饰与 VkSubpassDescription 结构的 pInputAttachments
数组中指定的输入附件进行匹配,该结构描述了执行片元着色器的子通道。
具有 UniformConstant
存储类和 InputAttachmentIndex
修饰的片元着色器子通道输入变量(这些变量被 OpEntryPoint
静态使用)构成了片元输入附件接口。这些变量必须声明为 OpTypeImage
类型,Dim
操作数为 SubpassData
,Arrayed
操作数为 0,Sampled
操作数为 2。如果对应的 VkAttachmentDescription 的 samples
字段为 VK_SAMPLE_COUNT_1_BIT
,且未启用多采样渲染到单采样,则 OpTypeImage
的 MS
操作数必须为 0,否则为 1。
使用 InputAttachmentIndex
修饰值 i 标识的子通道输入变量从 VkSubpassDescription
的 pInputAttachments
[i] 成员指示的输入附件中读取数据。如果子通道输入变量声明为大小为 N 的数组,它将消耗 N 个连续的输入附件,从指定的索引开始。必须不能有多个具有相同 InputAttachmentIndex
的输入变量,无论是显式声明还是由数组声明隐含的,每个图像方面都是如此。多方面图像(例如,深度/模板格式)可以使用相同的输入变量。可用输入附件索引的数量由 VkPhysicalDeviceLimits
结构的 maxPerStageDescriptorInputAttachments
成员给出。
当启用 dynamicRenderingLocalRead
功能使用动态渲染时,具有 InputAttachmentIndex
修饰值为 i 的子通道输入变量可以映射到颜色、深度或模板附件。
要在动态渲染期间设置输入附件索引映射,请调用
// Provided by VK_VERSION_1_4
void vkCmdSetRenderingInputAttachmentIndices(
VkCommandBuffer commandBuffer,
const VkRenderingInputAttachmentIndexInfo* pInputAttachmentIndexInfo);
或等效命令
// Provided by VK_KHR_dynamic_rendering_local_read
void vkCmdSetRenderingInputAttachmentIndicesKHR(
VkCommandBuffer commandBuffer,
const VkRenderingInputAttachmentIndexInfo* pInputAttachmentIndexInfo);
-
commandBuffer
是将记录命令的命令缓冲区。 -
pInputAttachmentIndexInfo
是一个 VkRenderingInputAttachmentIndexInfo 结构,指示新的映射。
此命令设置后续绘制命令的输入附件索引映射,并且必须与绑定管线提供的映射匹配(如果已绑定管线),可以通过将 VkRenderingInputAttachmentIndexInfo 链接到 VkGraphicsPipelineCreateInfo 来设置映射。
在此命令调用之前,命令缓冲区状态中的映射被视为 vkCmdBeginRendering 中指定的每个颜色附件映射到子通道输入,该子通道输入的 InputAttachmentIndex
等于其在 VkRenderingInfo::pColorAttachments
中的索引,并且深度/模板附件映射到没有这些修饰的输入附件。每当调用 vkCmdBeginRendering 时,此状态都会重置。
VkRenderingInputAttachmentIndexInfo
结构的定义如下
// Provided by VK_VERSION_1_4
typedef struct VkRenderingInputAttachmentIndexInfo {
VkStructureType sType;
const void* pNext;
uint32_t colorAttachmentCount;
const uint32_t* pColorAttachmentInputIndices;
const uint32_t* pDepthInputAttachmentIndex;
const uint32_t* pStencilInputAttachmentIndex;
} VkRenderingInputAttachmentIndexInfo;
或等效结构
// Provided by VK_KHR_dynamic_rendering_local_read
typedef VkRenderingInputAttachmentIndexInfo VkRenderingInputAttachmentIndexInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
colorAttachmentCount
是pColorAttachmentInputIndices
中的元素数量。 -
pColorAttachmentInputIndices
是指向一个包含colorAttachmentCount
个uint32_t
值的数组的指针,这些值定义了用作输入附件的颜色附件的索引。 -
pDepthInputAttachmentIndex
是NULL
或指向一个uint32_t
值的指针,该值定义了用作输入附件的深度附件的索引。 -
pStencilInputAttachmentIndex
是NULL
或指向一个uint32_t
值的指针,该值定义了用作输入附件的模板附件的索引。
此结构允许应用程序将附件重新映射到不同的输入附件索引。
pColorAttachmentInputIndices
的每个设置为 VK_ATTACHMENT_UNUSED
的元素都表示对应的附件将不会在此管线中用作输入附件。这些元素中的任何其他值都将对应的附件映射到着色器代码中定义的 InputAttachmentIndex
值。
如果 pColorAttachmentInputIndices
为 NULL
,则等效于将每个元素设置为其在数组中的索引。
如果 pDepthInputAttachmentIndex
或 pStencilInputAttachmentIndex
被设置为 NULL
,它们会映射到没有 InputAttachmentIndex
修饰符的输入附件。如果它们指向 VK_ATTACHMENT_UNUSED
值,则表示对应的附件将不会在此管线中用作输入附件。如果它们指向任何其他值,则会将对应的附件映射到着色器代码中定义的 InputAttachmentIndex
值。
此结构可以包含在 VkGraphicsPipelineCreateInfo 结构的 pNext
链中,以设置管线的此状态。如果此结构未包含在 VkGraphicsPipelineCreateInfo 的 pNext
链中,则相当于指定具有以下属性的此结构
-
colorAttachmentCount
设置为 VkPipelineRenderingCreateInfo::colorAttachmentCount
。 -
pColorAttachmentInputIndices
设置为NULL
。 -
pDepthInputAttachmentIndex
设置为NULL
。 -
pStencilInputAttachmentIndex
设置为NULL
。
此结构 **可以** 包含在 VkCommandBufferInheritanceInfo 结构的 pNext
链中,以指定从主命令缓冲区继承的状态。如果此结构未包含在 VkCommandBufferInheritanceInfo 的 pNext
链中,则相当于指定具有以下属性的此结构
-
colorAttachmentCount
设置为 VkCommandBufferInheritanceRenderingInfo::colorAttachmentCount
。 -
pColorAttachmentInputIndices
设置为NULL
。 -
pDepthInputAttachmentIndex
设置为NULL
。 -
pStencilInputAttachmentIndex
设置为NULL
。
用 InputAttachmentIndex
标识的变量 **必须** 仅由片元阶段使用。子通道输入的 数值格式 **必须** 与相应输入附件的格式匹配,否则从这些变量进行的子通道加载的值是 **未定义的**。如果帧缓冲附件同时包含深度和模板方面,则子通道输入的数值格式将确定着色器访问的是深度还是模板方面。
有关更多详细信息,请参阅 输入附件。
片元输入附件兼容性
由片元着色器静态访问的输入附件 **必须** 由一个描述符支持,该描述符等效于 VkFramebuffer 中的 VkImageView,但 subresourceRange.aspectMask
除外。 aspectMask
**必须** 等于着色器访问的方面。
光线追踪管线接口
光线追踪管线 **可能** 比其他管线具有更多的阶段,每个阶段有多个实例,并且阶段之间有更多动态交互,但仍然具有接口结构,这些结构遵守与其他管线中着色器阶段之间的接口相同的通用规则。光线追踪管线的三种阶段间接口变量是
-
光线有效载荷,包含为光线整个生命周期跟踪的数据。
-
命中属性,包含有关特定命中在处理期间的数据。
-
可调用数据,用于将数据传入和传出可调用着色器。
光线有效载荷和可调用数据在显式着色器调用指令中使用,因此它们具有传入的变体,以区分传递给调用的参数与后续着色器调用指令正在使用的任何其他有效载荷或数据。
阶段之间使用的接口结构 **必须** 在使用它的阶段之间匹配。具体而言
-
在任何命中或最近命中着色器中读取的命中属性结构 **必须** 与同一命中组中相应交点着色器中写入的命中属性结构相同。
-
可调用着色器的传入可调用数据 **必须** 与调用着色器中执行可调用指令引用的可调用数据相同。
-
由光线追踪命令调用的着色器的光线有效载荷 **必须** 对于使用该光线有效载荷的所有着色器阶段都相同。
任何具有传入光线有效载荷、传入可调用数据或命中属性的着色器 **必须** 仅声明一个该类型的变量。
着色器阶段 | 光线有效载荷 | 传入光线有效载荷 | 命中属性 | 可调用数据 | 传入的可调用数据 |
---|---|---|---|---|---|
射线生成 |
读/写 |
读/写 |
|||
相交 |
读/写 |
||||
任意命中 |
读/写 |
读 |
|||
最近命中 |
读/写 |
读/写 |
读 |
读/写 |
|
未命中 |
读/写 |
读/写 |
读/写 |
||
可调用 |
读/写 |
读/写 |
着色器资源接口
构成某个阶段着色器资源接口的着色器变量集合是指该阶段的OpEntryPoint
静态使用的,且存储类为Uniform
、UniformConstant
、StorageBuffer
或PushConstant
的变量。对于片段着色器,这包括片段输入附件接口。
着色器资源接口由两个子接口组成:推送常量接口和描述符集接口。
推送常量接口
使用PushConstant
存储类定义的,且由管道的着色器入口点静态使用的着色器变量,定义了推送常量接口。它们必须是
-
类型为
OpTypeStruct
, -
使用
Block
修饰符标识,并且 -
使用
Offset
、ArrayStride
和MatrixStride
修饰符显式布局,如偏移和步幅分配中所述。
每个着色器入口点静态使用的推送常量块不得超过一个。
推送常量块的每个静态使用成员的Offset
必须将其完全包含在每个使用它的OpEntryPoint
的VkPushConstantRange中,并且该范围的stageFlags
必须为该阶段指定适当的VkShaderStageFlagBits。推送常量块的任何成员的Offset
修饰符不得导致该成员所需的空间超出范围[0, maxPushConstantsSize
)。
声明为数组的推送常量块的任何成员必须仅使用动态均匀索引访问。
描述符集接口
描述符集接口由存储类为StorageBuffer
、Uniform
或UniformConstant
的着色器变量(包括片段输入附件接口中的变量)组成,这些变量由管道的着色器入口点静态使用。
这些变量必须指定DescriptorSet
和Binding
修饰符,这些修饰符按照描述符集和绑定分配中所述,在管道布局中与VkDescriptorSetLayout
对象进行分配和匹配。
对于用于OpImageRead
、OpImageSparseRead
或OpImageWrite
操作的变量,OpTypeImage
声明的Image
Format
不得为Unknown,除非在以下条件下:
-
对于
OpImageWrite
,如果图像格式列在无格式存储列表中,并且启用了shaderStorageImageWriteWithoutFormat
功能,并且着色器模块声明了StorageImageWriteWithoutFormat
功能。 -
对于
OpImageWrite
,如果图像格式支持VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT
并且着色器模块声明了StorageImageWriteWithoutFormat
功能。 -
对于
OpImageRead
或OpImageSparseRead
,如果图像格式列在无格式存储列表中,并且启用了shaderStorageImageReadWithoutFormat
功能,并且着色器模块声明了StorageImageReadWithoutFormat
功能。 -
对于
OpImageRead
或OpImageSparseRead
,如果图像格式支持VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT
并且着色器模块声明了StorageImageReadWithoutFormat
功能。 -
对于
OpImageRead
,如果Dim
是SubpassData
(表示从输入附件读取)。
对于用于OpAtomic*
操作的变量,OpTypeImage
声明的Image
Format
不得为Unknown。
使用Uniform
存储类标识的变量用于访问透明的缓冲区支持资源。此类变量必须是
-
类型为
OpTypeStruct
,或此类型的数组, -
使用
Block
或BufferBlock
修饰符标识,并且 -
使用
Offset
、ArrayStride
和MatrixStride
修饰符显式布局,如偏移和步幅分配中所述。
使用StorageBuffer
存储类标识的变量用于访问透明的缓冲区支持资源。此类变量必须是
-
类型为
OpTypeStruct
,或此类型的数组, -
使用
Block
修饰符标识,并且 -
使用
Offset
、ArrayStride
和MatrixStride
修饰符显式布局,如偏移和步幅分配中所述。
Uniform
存储类中任何Block
修饰的变量的成员的Offset
修饰符不得导致该变量所需的空间超出范围[0, maxUniformBufferRange
)。StorageBuffer
存储类中任何Block
修饰的变量的成员的Offset
修饰符不得导致该变量所需的空间超出范围[0, maxStorageBufferRange
)。
当变量分配给具有descriptorType
为VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK
的描述符集布局绑定时,使用Uniform
存储类标识的变量可以也用于访问透明的描述符集支持资源。在这种情况下,变量必须是类型为OpTypeStruct
,并且不能聚合到该类型的数组中。此外,此类变量的任何成员的Offset
修饰符不得导致该变量所需的空间超出范围[0,maxInlineUniformBlockSize
)。
使用UniformConstant
存储类和InputAttachmentIndex
修饰符标识的变量必须按照片段输入附件接口中所述进行声明。
用描述符集和绑定修饰的SPIR-V变量,该描述符集和绑定标识组合图像采样器描述符,可以具有OpTypeImage
、OpTypeSampler
(Sampled
=1) 或 OpTypeSampledImage
的类型。
当通过此类变量访问资源时,除非启用允许动态统一或非统一表达式的功能(如下所述),否则必须通过编译时常量表达式选择资源。
-
存储图像(存储纹理缓冲区和输入附件除外)
-
动态统一:
shaderStorageImageArrayDynamicIndexing
和StorageImageArrayDynamicIndexing
-
非统一:
shaderStorageImageArrayNonUniformIndexing
和StorageImageArrayNonUniformIndexing
-
-
存储纹理缓冲区
-
动态统一:
shaderStorageTexelBufferArrayDynamicIndexing
和StorageTexelBufferArrayDynamicIndexing
-
非统一:
shaderStorageTexelBufferArrayNonUniformIndexing
和StorageTexelBufferArrayNonUniformIndexing
-
-
输入附件
-
动态统一:
shaderInputAttachmentArrayDynamicIndexing
和InputAttachmentArrayDynamicIndexing
-
非统一:
shaderInputAttachmentArrayNonUniformIndexing
和InputAttachmentArrayNonUniformIndexing
-
-
采样图像(统一纹理缓冲区除外),采样器和组合图像采样器
-
动态统一:
shaderSampledImageArrayDynamicIndexing
和SampledImageArrayDynamicIndexing
-
非统一:
shaderSampledImageArrayNonUniformIndexing
和SampledImageArrayNonUniformIndexing
-
-
统一纹理缓冲区
-
动态统一:
shaderUniformTexelBufferArrayDynamicIndexing
和UniformTexelBufferArrayDynamicIndexing
-
非统一:
shaderUniformTexelBufferArrayNonUniformIndexing
和UniformTexelBufferArrayNonUniformIndexing
-
-
统一缓冲区
-
动态统一:
shaderUniformBufferArrayDynamicIndexing
和UniformBufferArrayDynamicIndexing
-
非统一:
shaderUniformBufferArrayNonUniformIndexing
和UniformBufferArrayNonUniformIndexing
-
-
存储缓冲区
-
动态统一:
shaderStorageBufferArrayDynamicIndexing
和StorageBufferArrayDynamicIndexing
-
非统一:
shaderStorageBufferArrayNonUniformIndexing
和StorageBufferArrayNonUniformIndexing
-
-
加速结构
-
动态统一:始终支持。
-
非统一:始终支持。
-
-
权重图像:
-
动态统一:始终支持。
-
非统一:从不支持。
-
-
-
动态统一:始终支持。
-
非统一:从不支持。
-
如果子组不一定是其硬件的调用组的子集(例如,如果多个绘制调用打包在一起),则在实现此功能时,实现必须小心。如果此类实现需要在子组内对任何资源访问保持统一性,则如果它们声明了相应的功能,则实现负责确保在调用组中仅动态统一的索引仍然按预期工作。
启用采样器 Y′CBCR 转换或采样子采样图像的数组中的组合图像采样器,必须仅通过常量整数表达式进行索引。
资源类型 | 描述符类型 |
---|---|
采样器 |
|
采样图像 |
|
存储图像 |
|
组合图像采样器 |
|
统一纹理缓冲区 |
|
存储纹理缓冲区 |
|
统一缓冲区 |
|
存储缓冲区 |
|
输入附件 |
|
内联统一块 |
|
加速结构 |
|
权重图像 |
|
块匹配图像 |
|
资源类型 | 存储类 | 类型1 | 修饰符2 |
---|---|---|---|
采样器 |
|
|
|
采样图像 |
|
|
|
存储图像 |
|
|
|
组合图像采样器 |
|
|
|
统一纹理缓冲区 |
|
|
|
存储纹理缓冲区 |
|
|
|
统一缓冲区 |
|
|
|
存储缓冲区 |
|
|
|
|
|
||
输入附件 |
|
|
|
内联统一块 |
|
|
|
加速结构 |
|
|
|
采样权重图像 |
|
|
|
块匹配图像 |
|
|
|
- 1
-
在引用
OpTypeImage
的地方,只有在明确引用的地方才接受Dim
值Buffer
和Subpassdata
。它们不对应于指定了通用OpTypeImage
的资源类型。 - 2
-
除了
DescriptorSet
和Binding
。
描述符集和绑定分配
使用 s 的 DescriptorSet
修饰符和 b 的 Binding
修饰符修饰的变量表示该变量与 VkDescriptorSetLayoutBinding 相关联,该 VkDescriptorSetLayoutBinding 在 VkPipelineLayoutCreateInfo 中指定的 pSetLayouts
[s] 中具有等于 b 的 binding
。
DescriptorSet
修饰符值必须在零和 maxBoundDescriptorSets
减一之间,包括零和 maxBoundDescriptorSets
减一。如 描述符集布局中所述,Binding
修饰符值可以是任何 32 位无符号整数值。每个描述符集都有其自己的绑定名称空间。
如果 Binding
修饰符与数组一起使用,则整个数组都分配有该绑定值。数组必须是一维数组,并且数组的大小必须不大于绑定中描述符的数量。如果数组的大小在运行时确定,则不得使用大于或等于绑定描述符集中该绑定的元素。如果数组的大小在运行时确定,则必须启用runtimeDescriptorArray
功能,并且必须声明 RuntimeDescriptorArray
功能。数组的每个元素的索引称为arrayElement。为了进行接口匹配和描述符集操作,如果资源变量不是数组,则将其视为具有零的 arrayElement。
如着色器资源限制所示,管线阶段可以访问的每种类型的资源数量都有限制。“每个阶段的资源”列给出了在管线中任何给定阶段的入口点可以静态使用的每种资源类型的数量限制。“资源类型”列列出了计入限制的资源类型。某些资源类型会针对多个限制进行计数。VK_DESCRIPTOR_TYPE_MUTABLE_EXT
描述符类型会被计为单个资源,并且对于关联绑定中的VkMutableDescriptorTypeListEXT中存在的每个描述符集类型的唯一资源限制,也会计为一个资源。如果VkMutableDescriptorTypeListEXT中的多个描述符类型映射到同一个资源限制,则在计算资源限制时仅消耗一个描述符。
管线布局可能包含描述符集和绑定,这些描述符集和绑定没有被绑定stageFlags
中着色器阶段入口点静态使用的任何变量引用。
但是,如果分配给给定DescriptorSet
和Binding
的变量被着色器阶段的入口点静态使用,则管线布局必须包含该描述符集布局中以及该绑定编号的描述符集布局绑定,并且该绑定的stageFlags
必须包含该阶段的适当的VkShaderStageFlagBits。变量必须是其SPIR-V类型和存储类确定的有效资源类型,如着色器资源和存储类对应关系中所定义。描述符集布局绑定必须是相应的描述符类型,如着色器资源和描述符类型对应关系中所定义。
着色器中可以具有重叠的set和binding值的着色器变量的数量没有限制;但是哪些资源被静态使用会产生影响。如果任何标识资源的着色器变量在着色器中被静态使用,则在着色器执行时,在声明的set和binding处绑定的底层描述符必须支持着色器中声明的类型。 如果声明了多个具有相同set和binding值以及相同底层描述符类型的着色器变量,则它们都可以在同一着色器中静态使用。但是,访问不会自动同步,并且应使用 如果在一个着色器中声明了多个具有相同set和binding值但声明类型不同的着色器变量,而这些变量中的任何一个都不受相关绑定描述符支持,则只有在未使用静态使用不支持类型的变量时,才能执行该着色器。 使用共享相同描述符集和绑定值的多个静态使用着色器变量的一个值得注意的示例是 |
每个阶段的资源 | 资源类型 |
---|---|
|
采样器 |
组合图像采样器 |
|
|
采样图像 |
组合图像采样器 |
|
统一纹理缓冲区 |
|
采样权重图像 |
|
块匹配图像 |
|
|
存储图像 |
存储纹理缓冲区 |
|
|
统一缓冲区 |
uniform buffer 动态 |
|
|
存储缓冲区 |
storage buffer 动态 |
|
|
输入附件1 |
|
内联统一块 |
|
加速结构 |
- 1
-
输入附件只能在片段着色器阶段使用
偏移量和步幅分配
某些对象必须使用Offset
、ArrayStride
和MatrixStride
显式布局,如SPIR-V 显式布局验证规则中所述。所有此类布局也必须符合以下要求。
|
对齐要求
对齐要求因特定资源和启用的功能而异。
矩阵类型根据数组定义如下
-
具有C列和R行的列主矩阵等效于具有R个分量的C元素向量数组。
-
具有C列和R行的行主矩阵等效于具有C个分量的R元素向量数组。
OpTypeStruct
成员类型的标量对齐定义递归如下
-
大小为N的标量具有N的标量对齐。
-
向量类型的标量对齐等于其组件类型的标量对齐。
-
数组类型的标量对齐等于其元素类型的标量对齐。
-
结构的标量对齐等于其任何成员的最大标量对齐。
-
矩阵类型从等效的数组声明继承标量对齐。
OpTypeStruct
成员类型的基本对齐定义递归如下
-
标量的基本对齐等于其标量对齐。
-
双分量向量的基本对齐等于其标量对齐的两倍。
-
三分量或四分量向量的基本对齐等于其标量对齐的四倍。
-
数组的基本对齐等于其元素类型的基本对齐。
-
结构的基本对齐等于其任何成员的最大基本对齐。空结构的基本对齐等于 SPIR-V 模块中声明的功能允许的最小标量类型的大小。(例如,对于
StorageBuffer
存储类中 1 字节对齐的空结构,必须在 SPIR-V 模块中声明StorageBuffer8BitAccess
或UniformAndStorageBuffer8BitAccess
。) -
矩阵类型从等效的数组声明继承基本对齐。
OpTypeStruct
成员类型的扩展对齐也定义如下
-
标量或向量类型的扩展对齐等于其基本对齐。
-
数组或结构类型的扩展对齐等于其任何成员的最大扩展对齐,向上舍入到 16 的倍数。
-
矩阵类型从等效的数组声明继承扩展对齐方式。
如果满足以下任一条件,则认为成员不正确地跨越:
-
它是一个总大小小于等于 16 字节的向量,并且其
Offset
修饰符将其第一个字节放置在 F,最后一个字节放置在 L,其中 floor(F / 16) != floor(L / 16)。 -
它是一个总大小大于 16 字节的向量,并且其
Offset
修饰符将其第一个字节放置在不是 16 的整数倍的位置。
标准缓冲区布局
OpTypeStruct
的每个需要显式布局的成员必须按照以下第一个匹配的规则对齐。如果该结构包含在多个存储类的指针类型中,则它必须满足用于引用它的每个存储类的要求。
-
如果启用了
scalarBlockLayout
功能,并且存储类是Uniform
、StorageBuffer
、PhysicalStorageBuffer
、ShaderRecordBufferKHR
或PushConstant
,则每个成员必须按照其标量对齐方式对齐。 -
如果启用了
workgroupMemoryExplicitLayoutScalarBlockLayout
功能,并且存储类是Workgroup
,则每个成员必须按照其标量对齐方式对齐。 -
所有向量必须按照其标量对齐方式对齐。
-
如果未启用
uniformBufferStandardLayout
功能,则存储类为Uniform
且具有Block
修饰的OpTypeStruct
的任何成员必须按照其扩展对齐方式对齐。 -
其他每个成员必须按照其基本对齐方式对齐。
即使支持标量对齐,通常使用基本对齐性能更高。 |
内存布局必须遵守以下规则:
-
任何成员的
Offset
修饰符必须是其对齐方式的倍数。 -
任何
ArrayStride
或MatrixStride
修饰符必须是如上定义的数组或矩阵的对齐方式的倍数。
如果满足以下条件之一:
-
存储类是
Uniform
、StorageBuffer
、PhysicalStorageBuffer
、ShaderRecordBufferKHR
或PushConstant
,并且未启用scalarBlockLayout
功能。 -
存储类是
Workgroup
,并且结构成员不是Block
的一部分,或者未启用workgroupMemoryExplicitLayoutScalarBlockLayout
功能。 -
存储类是任何其他存储类。
则内存布局必须还遵守以下规则:
-
向量必须不发生如上定义的不正确跨越。
-
成员的
Offset
修饰符必须不将其放置在结构、数组或矩阵的末尾与该结构、数组或矩阵的下一个对齐方式的倍数之间。
GLSL 中的 std430 布局满足使用基本对齐方式的类型的这些规则。 std140 布局满足使用扩展对齐方式的类型的规则。 |
内置变量
通过声明使用 BuiltIn
SPIR-V 修饰符修饰的变量,可以在着色器中访问内置变量。每个 BuiltIn
修饰符的含义如下。在本节的其余部分中,内置名称与等效于使用该特定内置修饰的变量的术语互换使用。表示整数值的内置变量可以声明为有符号或无符号的 32 位整数。
如上所述,相对于其他着色器输入和输出,某些输入和输出具有额外的数组级别。此数组级别未包含在下面的类型描述中,但声明内置变量时必须包含它。
列为同一 OpEntryPoint
的操作数的任何两个 Input
存储类 OpVariable
声明必须不具有相同的 BuiltIn
修饰符。列为同一 OpEntryPoint
的操作数的任何两个 Output
存储类 OpVariable
声明必须不具有相同的 BuiltIn
修饰符。
BaryCoordKHR
-
BaryCoordKHR
修饰符可以用于修饰片段着色器输入变量。此变量将包含一个三组件浮点向量,其中包含重心权重,指示片段相对于其图元顶点的屏幕空间位置(使用透视插值获得)。
BaryCoordNoPerspAMD
-
BaryCoordNoPerspAMD
修饰符可以用于修饰片段着色器输入变量。此变量将包含与片段的中心通过线性插值计算的重心坐标对应的 (I,J) 对。考虑到恒等式 I + J + K = 1.0,可以导出重心坐标的 K 坐标。
BaryCoordNoPerspKHR
-
BaryCoordNoPerspKHR
修饰符可以用于修饰片段着色器输入变量。此变量将包含一个三组件浮点向量,其中包含重心权重,指示片段相对于其图元顶点的屏幕空间位置(使用线性插值获得)。
BaryCoordNoPerspCentroidAMD
-
BaryCoordNoPerspCentroidAMD
修饰符可以用于修饰片段着色器输入变量。此变量将包含使用质心处的线性插值计算的片段对应的重心坐标 (I,J) 对。重心坐标的 K 坐标可以通过 I + J + K = 1.0 的等式推导得出。
BaryCoordNoPerspSampleAMD
-
BaryCoordNoPerspSampleAMD
修饰符可以用于修饰片段着色器输入变量。此变量将包含使用每个覆盖样本处的线性插值计算的片段对应的重心坐标 (I,J) 对。重心坐标的 K 坐标可以通过 I + J + K = 1.0 的等式推导得出。
BaryCoordPullModelAMD
-
BaryCoordPullModelAMD
修饰符可以用于修饰片段着色器输入变量。此变量将包含在片段中心计算的 (1/W, 1/I, 1/J),可以用于计算梯度,然后在任何所需的样本位置插值 I、J 和 W。
BaryCoordSmoothAMD
-
BaryCoordSmoothAMD
修饰符可以用于修饰片段着色器输入变量。此变量将包含使用片段中心处的透视插值计算的片段对应的重心坐标 (I,J) 对。重心坐标的 K 坐标可以通过 I + J + K = 1.0 的等式推导得出。
BaryCoordSmoothCentroidAMD
-
BaryCoordSmoothCentroidAMD
修饰符可以用于修饰片段着色器输入变量。此变量将包含使用质心处的透视插值计算的片段对应的重心坐标 (I,J) 对。重心坐标的 K 坐标可以通过 I + J + K = 1.0 的等式推导得出。
BaryCoordSmoothSampleAMD
-
BaryCoordSmoothSampleAMD
修饰符可以用于修饰片段着色器输入变量。此变量将包含使用每个覆盖样本处的透视插值计算的片段对应的重心坐标 (I,J) 对。重心坐标的 K 坐标可以通过 I + J + K = 1.0 的等式推导得出。
BaseInstance
-
使用
BaseInstance
内置变量修饰一个变量,将使该变量包含与传递给调用当前顶点着色器调用的命令的第一个实例对应的整数值。BaseInstance
是直接绘制命令的firstInstance
参数,或是间接绘制命令所使用的结构体的firstInstance
成员。
BaseVertex
-
使用
BaseVertex
内置变量修饰一个变量,将使该变量包含与传递给调用当前顶点着色器调用的命令的第一个顶点或顶点偏移量对应的整数值。对于非索引绘制命令,此变量是直接绘制命令的firstVertex
参数,或是间接绘制命令所使用的结构体的firstVertex
成员。对于索引绘制命令,此变量是直接绘制命令的vertexOffset
参数,或是间接绘制命令所使用的结构体的vertexOffset
成员。
ClipDistance
-
使用
ClipDistance
内置修饰符修饰一个变量,将使该变量包含用于控制用户裁剪的机制。ClipDistance
是一个数组,数组的第 i 个元素指定平面 i 的裁剪距离。裁剪距离为 0 表示顶点在平面上,正距离表示顶点在裁剪半空间内,负距离表示顶点在裁剪半空间外。
使用 |
在最后一个光栅化前着色器阶段,这些值将在图元上线性插值,且插值距离小于 0 的图元部分将被视为在裁剪体之外。如果片段着色器随后使用 |
ClipDistancePerViewNV
-
使用
ClipDistancePerViewNV
内置修饰符修饰一个变量,将使该变量包含每个视口的裁剪距离。每个视口的裁剪距离具有与ClipDistance
相同的语义。
ClusterIDHUAWEI
-
ClusterIDHUAWEI
修饰符可用于修饰集群剔除着色器输出变量,此变量将包含一个整数值,该值指定此绘制命令正在渲染的集群的 ID。当启用集群剔除着色器时,ClusterIDHUAWEI
将替换传递给顶点着色器的 gl_DrawID 以获取与集群相关的信息。
ClusterShadingRateHUAWEI
-
ClusterShadingRateHUAWEI
修饰符可用于修饰集群剔除着色器输出变量。此变量将包含一个整数值,该值指定渲染集群的着色率。
CullDistance
-
用
CullDistance
内建修饰符修饰变量将使该变量包含控制用户裁剪的机制。如果此数组的任何成员对于属于图元的所有顶点都赋值为负值,则会在光栅化之前丢弃该图元。
在片段着色器中, |
如果 |
CullDistancePerViewNV
-
用
CullDistancePerViewNV
内建修饰符修饰变量将使该变量包含每个视口的裁剪距离。每个视口的裁剪距离具有与CullDistance
相同的语义。
CullPrimitiveEXT
-
用
CullPrimitiveEXT
内建修饰符修饰变量将使该变量包含输出图元的裁剪状态。如果每个图元的布尔值为true
,则会裁剪该图元;如果为false
,则不会裁剪该图元。
CullMaskKHR
-
用
CullMaskKHR
修饰符修饰的变量将指定正在处理的光线的裁剪掩码。该值由传递给OpTrace*
指令之一的Cull Mask
参数给出。
CurrentRayTimeNV
-
用
CurrentRayTimeNV
修饰符修饰的变量包含传递给调用此着色器的OpTraceRayMotionNV
的时间值。
DeviceIndex
-
The
DeviceIndex
decoration can be applied to a shader input which will be filled with the device index of the physical device that is executing the current shader invocation. This value will be in the range , where physicalDeviceCount is thephysicalDeviceCount
member of VkDeviceGroupDeviceCreateInfo.
DrawIndex
-
使用
DrawIndex
内置修饰符修饰变量,将使该变量包含一个整数值,该值对应于调用当前任务、网格或顶点着色器调用的绘制的从零开始的索引。对于间接绘制命令,DrawIndex
从零开始,并为执行的每个绘制递增一。绘制次数由drawCount
参数给出。对于直接绘制命令,如果使用 vkCmdDrawMultiEXT 或 vkCmdDrawMultiIndexedEXT,则此变量包含与绘制的从零开始的索引对应的整数值。否则,DrawIndex
始终为零。DrawIndex
是动态一致的。
当使用任务或网格着色器时,只有第一个活动的阶段才能正确访问该变量。其他阶段读取的值是未定义的。
FirstIndexHUAWEI
-
FirstIndexHUAWEI
修饰符可用于修饰集群剔除着色器输出变量,此索引模式特定变量将包含一个整数值,该值指定与集群对应的索引缓冲区内的基本索引。
FragCoord
-
使用
FragCoord
内置修饰符修饰变量,将使该变量包含正在处理的片段的坐标 (x,y,z,1/w)。(x,y) 值是片段的帧缓冲区坐标 (xf,yf)。
当启用 样本着色 时,
FragCoord
的 x 和 y 分量反映与着色器调用对应的其中一个样本的位置。否则,
FragCoord
的 x 和 y 分量反映片段中心的位置。FragCoord
的 z 分量是图元的插值深度值。w 分量是插值的 。
Centroid
插值修饰符在FragCoord
上被忽略,但是允许使用。
FragDepth
-
要使着色器提供片段深度值,着色器必须声明
DepthReplacing
执行模式。此类着色器的片段深度值将来自用FragDepth
内置修饰符修饰的变量。此值将用于实现执行的任何后续深度测试或写入深度附件。有关详细信息,请参见片段着色器深度替换。
FirstInstanceHUAWEI
-
FirstInstanceHUAWEI
修饰符可用于修饰集群剔除着色器输出变量,此变量将包含一个整数值,该值指定要绘制的第一个实例的实例 ID。
FirstVertexHUAWEI
-
FirstVertexHUAWEI
修饰符可以用来修饰集群剔除着色器输出变量。这个非索引模式的特定变量将包含一个整数值,该值指定要绘制的集群中第一个顶点的索引。
FragInvocationCountEXT
-
用
FragInvocationCountEXT
内置修饰符修饰变量将使该变量包含片段着色器的最大调用次数,由minSampleShading
确定。如果 样本着色 未启用,则
FragInvocationCountEXT
将填充值为 1。
FragSizeEXT
-
用
FragSizeEXT
内置修饰符修饰变量将使该变量包含该次调用片段所覆盖的区域的像素尺寸。如果未启用片段密度图,则
FragSizeEXT
将填充值为 (1,1)。
FragStencilRefEXT
-
用
FragStencilRefEXT
内置修饰符修饰变量将使该变量包含片段覆盖的所有样本的新模板引用值。此值将用作模板测试中使用的模板引用值。要写入
FragStencilRefEXT
,着色器必须声明StencilRefReplacingEXT
执行模式。如果着色器声明了StencilRefReplacingEXT
执行模式,并且着色器中存在未设置FragStencilRefEXT
的执行路径,则对于采用该路径的着色器执行,片段的模板引用值是未定义的。仅考虑用
FragStencilRefEXT
修饰的变量的整数值的最低有效位 s 位用于模板测试,其中 s 是模板帧缓冲区附件中的位数,并且丢弃高位。有关更多详细信息,请参见片段着色器模板引用替换。
FragmentSizeNV
-
用
FragmentSizeNV
内置修饰符修饰变量将使该变量包含片段的宽度和高度。
FrontFacing
-
用
FrontFacing
内置修饰符修饰变量将使该变量包含片段是正面还是背面。如果当前片段被认为是正面多边形图元的一部分,或者是非多边形图元的一部分,则此变量为非零值;如果该片段被认为是背面多边形图元的一部分,则为零值。
FullyCoveredEXT
-
使用
FullyCoveredEXT
内建修饰符装饰变量将使该变量指示片元区域是否被生成图元完全覆盖。如果启用了保守光栅化并且当前片元区域被生成图元完全覆盖,则此变量为非零值;如果片元未被覆盖或部分覆盖,或者保守光栅化被禁用,则此变量为零值。
GlobalInvocationId
-
使用
GlobalInvocationId
内建修饰符装饰变量将使该变量包含当前调用在全局工作组中的位置。每个组件等于本地工作组的索引乘以本地工作组的大小加上LocalInvocationId
。
HelperInvocation
-
使用
HelperInvocation
内建修饰符装饰变量将使该变量包含当前调用是否为辅助调用。如果当前着色的片元是辅助调用,则此变量为非零值,否则为零值。辅助调用是为了满足内部要求(如生成导数)而产生的着色器调用。
辅助调用很可能具有 |
HitKindKHR
-
使用
HitKindKHR
修饰符装饰的变量将描述触发当前着色器执行的交点。这些值由交点着色器确定。对于用户定义的交点着色器,这是传递给OpReportIntersectionKHR
的“命中类型”操作数的值。对于三角形交点候选,这将是HitKindFrontFacingTriangleKHR
或HitKindBackFacingTriangleKHR
之一。
HitTNV
-
使用
HitTNV
修饰符装饰的变量等同于使用RayTmaxKHR
修饰符装饰的变量。
HitTriangleVertexPositionsKHR
-
使用
HitTriangleVertexPositionsKHR
修饰符装饰的变量将以应用程序提供的顺序指定当前交点处三角形的对象空间顶点。返回的位置由几何变换转换,该变换以标准的浮点精度执行,但没有明确定义的浮点运算顺序来执行矩阵乘法。
IncomingRayFlagsKHR
-
带有
IncomingRayFlagsKHR
修饰符的变量将包含传递到调用此特定着色器的跟踪调用中的射线标志。在射线追踪管线上设置管线标志必须不会导致任何相应的标志在带有此修饰符的变量中设置。
IndexCountHUAWEI
-
IndexCountHUAWEI
修饰符可用于修饰集群剔除着色器输出变量。这个索引模式特定的变量将包含一个整数值,指定要绘制的集群中索引顶点的数量。
InstanceCountHUAWEI
-
InstanceCountHUAWEI
修饰符可用于修饰集群剔除着色器输出变量。这个变量将包含一个整数值,指定一个集群中要绘制的实例的数量。
InstanceCustomIndexKHR
-
使用
InstanceCustomIndexKHR
修饰符修饰的变量将包含与当前光线相交的实例的应用程序定义值。该变量在低 24 位包含 VkAccelerationStructureInstanceKHR::instanceCustomIndex
中为当前加速结构实例指定的值,高 8 位将为零。
InstanceId
-
在相交、任何命中或最近命中着色器中使用
InstanceId
修饰符修饰变量,将使该变量包含与当前光线相交的实例的索引。
InvocationId
-
使用
InvocationId
内置修饰符修饰变量将使该变量包含几何着色器中当前着色器调用的索引,或者细分控制着色器中输出面片顶点的索引。在几何着色器中,当前着色器调用的索引范围从零到着色器中声明的实例数减一。如果几何着色器的实例计数为一或未指定,则
InvocationId
将为零。
InvocationsPerPixelNV
-
使用
InvocationsPerPixelNV
内置修饰符修饰变量将使该变量包含每个像素的最大片段着色器调用次数,该调用次数来源于片段的有效着色率。如果一个图元没有完全覆盖一个像素,则该像素的片段着色器调用次数可能小于InvocationsPerPixelNV
的值。如果着色率指示一个片段覆盖多个像素,则InvocationsPerPixelNV
将为一。
InstanceIndex
-
在顶点着色器中,使用
InstanceIndex
内建修饰符装饰一个变量,将使该变量包含当前顶点着色器调用正在处理的实例的索引。InstanceIndex
的起始值是 vkCmdDraw 或 vkCmdDrawIndexed 的firstInstance
参数,或者是由 vkCmdDrawIndirect 或 vkCmdDrawIndexedIndirect 消费的结构的firstInstance
成员。
LaunchIdKHR
-
用
LaunchIdKHR
修饰符装饰的变量将指定正在处理的工作项的索引。对于由 vkCmdTraceRaysKHR 或 vkCmdTraceRaysNV 命令调度的每个width
×height
×depth
项,都会生成一个工作项。所有着色器调用都继承用LaunchIdKHR
修饰的变量的相同值。
LaunchSizeKHR
-
用
LaunchSizeKHR
修饰符装饰的变量将包含传递给 vkCmdTraceRaysKHR 或 vkCmdTraceRaysNV 命令的width
、height
和depth
维度,该命令启动了此着色器执行。width
在第一个组件中,height
在第二个组件中,depth
在第三个组件中。
Layer
-
使用
Layer
内建修饰符装饰变量,将使该变量包含多层帧缓冲附件的选定层。在网格、顶点、细分评估或几何着色器中,任何使用
Layer
装饰的变量都可以写入帧缓冲层索引,该着色器产生的图元将指向该索引。最后一个活动的 光栅化前着色器阶段(按管线顺序)控制使用的
Layer
。即使最后一个阶段未能写入Layer
,也不使用先前着色器阶段的输出。如果最后一个活动的 光栅化前着色器阶段着色器入口点的接口不包含用
Layer
修饰的变量,则使用第一层。如果一个 光栅化前着色器阶段着色器入口点的接口包含用Layer
修饰的变量,它 必须 为给定图元的所有输出顶点写入相同的Layer
值。如果Layer
值小于 0 或大于或等于帧缓冲中的层数,则图元 可能 仍然被光栅化,片段着色器 可能 被执行,并且所有层的帧缓冲值都是 未定义的。在网格着色器中,当Layer
值大于或等于maxMeshOutputLayers
限制时,也适用此情况。如果使用
Layer
修饰的变量也使用ViewportRelativeNV
修饰,则会将ViewportIndex
添加到用于渲染并在片段着色器中可用的层。如果着色器写入使用
ViewportMaskNV
修饰的变量,则选择的层对于图元渲染到的每个视口都有不同的值。在片段着色器中,使用
Layer
修饰的变量包含片段调用所属的图元的层索引。
LayerPerViewNV
-
使用
LayerPerViewNV
内建修饰符装饰的变量将包含每个视口的每视口层信息。每视口层的语义与每个视口的Layer
相同。
LocalInvocationId
-
使用
LocalInvocationId
内建修饰符修饰变量将使该变量包含当前集群剔除、任务、网格或计算着色器在本地工作组内的调用位置。每个分量的范围从零到该维度的工作组大小减一。
如果特定维度的工作组大小为一,则该维度的 |
LocalInvocationIndex
-
使用
LocalInvocationIndex
内建修饰符修饰变量将使该变量包含LocalInvocationId
的一维表示。计算方式如下:LocalInvocationIndex = LocalInvocationId.z * WorkgroupSize.x * WorkgroupSize.y + LocalInvocationId.y * WorkgroupSize.x + LocalInvocationId.x;
MeshViewCountNV
-
使用
MeshViewCountNV
内建修饰符修饰变量将使该变量包含当前网格或任务着色器调用所处理的视图数量。
MeshViewIndicesNV
-
使用
MeshViewIndicesNV
内建修饰符修饰变量将使该变量包含网格视图索引。网格视图索引是一个数组,其中每个元素都保存当前网格或任务着色器调用所处理的视图之一的视图编号。索引大于或等于MeshViewCountNV
的数组元素的值是未定义的。如果MeshViewIndicesNV
[i] 的值为 j,则当处理视图索引为 j 的图元时,使用PerViewNV
修饰的任何输出都将取数组元素 i 的值。
NumSubgroups
-
使用
NumSubgroups
内建修饰符修饰变量将使该变量包含本地工作组中的子组数量。
NumWorkgroups
-
使用
NumWorkgroups
内建修饰符修饰变量将使该变量包含属于调度的本地工作组的数量,调用属于该调度的一部分。每个分量等于传递到调度命令中的工作组计数参数的值。
ObjectRayDirectionKHR
-
使用
ObjectRayDirectionKHR
修饰的变量将指定正在处理的光线在对象空间中的方向。
ObjectRayOriginKHR
-
使用
ObjectRayOriginKHR
修饰的变量将指定正在处理的光线在对象空间中的原点。
ObjectToWorldKHR
-
使用
ObjectToWorldKHR
修饰的变量将包含当前对象到世界变换矩阵,该矩阵由当前相交的实例确定。
PatchVertices
-
使用
PatchVertices
内建修饰符修饰变量,将使该变量包含着色器正在处理的输入面片中的顶点数。在细分控制着色器中,这与 VkPipelineTessellationStateCreateInfo 的 name:patchControlPoints 成员相同。在细分评估着色器中,PatchVertices
等于细分控制输出面片大小。当同一个着色器在面片大小配置不同的不同管线中使用时,PatchVertices
变量的值也会有所不同。
PointCoord
-
使用
PointCoord
内建修饰符修饰变量,将使该变量包含当前片元在光栅化点内的坐标,该坐标已归一化为点的尺寸,原点位于点的左上角,如 基本点光栅化中所述。如果片元着色器调用所属的图元不是点,则使用PointCoord
修饰的变量包含未定义的值。
根据点的光栅化方式, |
PointSize
-
使用
PointSize
内建修饰符修饰变量,将使该变量包含点图元的大小,或者如果 多边形模式 为VK_POLYGON_MODE_POINT
且VkPhysicalDeviceMaintenance5Properties
::polygonModePointSize
设置为VK_TRUE
,则该变量将包含多边形的最终光栅化大小。管线中最后一个预光栅化着色器阶段写入到使用PointSize
修饰的变量的值用作光栅化产生的点的帧缓冲空间大小。如果启用了maintenance5
功能,并且没有值写入到使用PointSize
修饰的变量,则使用 1.0 作为点的大小。
当 |
Position
-
使用
Position
内建修饰符修饰变量,将使该变量包含当前顶点的位置。在最后一个光栅化前着色器阶段中,使用Position
修饰的变量的值将用于后续的图元组装、裁剪和光栅化操作。
当 |
PositionPerViewNV
-
使用
PositionPerViewNV
内建修饰符修饰变量,将使该变量包含当前顶点针对每个视图的位置。数组的元素对应于多视图子通道中的视图,并且与着色器编译时所针对的子通道的视图掩码中的视图相对应的元素将用作这些视图的位置值。对于管线中的最后一个光栅化前着色器阶段,写入到使用
PositionPerViewNV
修饰的输出变量的值将用于后续的图元组装、裁剪和光栅化操作,就像使用Position
一样。在较早的光栅化前着色器阶段中,PositionPerViewNV
的输出可在随后的光栅化前着色器阶段中作为输入使用。如果着色器是针对设置了
VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX
位的子通道编译的,则每个视图的位置值必须仅在 X 分量中不同。如果值确实不同,则将以实现相关的方式选择一个值。
PrimitiveCountNV
-
使用
PrimitiveCountNV
修饰变量,将使该变量包含图元计数。图元计数指定网格着色器产生的输出网格中将由后续管线阶段处理的图元数量。
PrimitiveId
-
使用
PrimitiveId
内建修饰符修饰变量,将使该变量包含当前图元的索引。绘图命令生成的第一个图元的索引为零,并且在处理完每个单独的点、线或三角形图元后,该索引会递增。
对于绘制为点或线段的三角形(请参见多边形模式),即使最终绘制多个点或线,图元索引也仅递增一次。
使用
PrimitiveId
修饰的变量在每次绘制的实例之间都会重置为零。使用图元重启重启图元拓扑结构对使用
PrimitiveId
修饰的变量的值没有影响。在细分控制和细分评估着色器中,它将包含当前渲染图元集中与着色器调用对应的面片索引。
在几何着色器中,它将包含自当前渲染图元集开始以来,呈现给着色器作为输入的图元数量。
在片段着色器中,如果存在网格着色器,则它将包含网格着色器写入的图元索引;如果存在几何着色器,则它将包含几何着色器写入的图元索引;或者如果存在几何着色器,则它将包含本应呈现给几何着色器作为输入的值。
在交集、任何命中或最近命中着色器中,它将包含正在处理的三角形或边界框在几何体中的索引。
当 使用 |
PrimitiveIndicesNV
-
用
PrimitiveIndicesNV
修饰符修饰一个变量将使该变量包含顶点索引值的输出数组。根据使用执行模式声明的输出图元类型,索引被分为一组(OutputPoints
)、两组(OutputLinesNV
)或三组(OutputTrianglesNV
)索引,每组生成一个图元。
PrimitivePointIndicesEXT
-
用
PrimitivePointIndicesEXT
修饰符修饰一个变量将使该变量包含点图元的顶点索引值的输出数组。
PrimitiveLineIndicesEXT
-
用
PrimitiveLineIndicesEXT
修饰符修饰一个变量将使该变量包含线图元的顶点索引值的输出数组。
PrimitiveTriangleIndicesEXT
-
使用
PrimitiveTriangleIndicesEXT
修饰符修饰变量将使该变量包含三角形图元的顶点索引值的输出数组。
RayGeometryIndexKHR
-
使用
RayGeometryIndexKHR
修饰的变量将包含当前着色的加速结构几何体的几何体索引。
RayTminKHR
-
使用
RayTminKHR
修饰的变量将包含正在处理的光线的参数 tmin 值。该值独立于光线原点和方向存在的空间。该值是传递给管线追踪光线指令的参数。tmin 值在光线查询的持续时间内保持不变。
SampleMask
-
使用
SampleMask
内置修饰符修饰变量将使任何变量包含当前片段着色器调用的样本掩码。使用
SampleMask
修饰的Input
存储类中的变量将包含在光栅化期间生成片段的图元覆盖的样本集合的位掩码。当且仅当样本被认为对此片段着色器调用已覆盖时,才设置样本位。SampleMask
[] 是一个整数数组。位以一种方式映射到样本,其中掩码 M (SampleMask[M]
) 的位 B 对应于样本 32 × M + B。使用
SampleMask
修饰的Output
存储类中的变量是一个整数数组,形成一个位数组,类似于使用SampleMask
修饰的输入变量,但其中每个位都表示着色器计算的覆盖率。此计算出的SampleMask
与多重采样覆盖操作中生成的覆盖掩码相结合。使用
SampleMask
修饰的变量必须是无大小的数组,或显式大小设置为不大于实现相关的最大样本掩码(作为 32 位元素的数组),该最大样本掩码由最大样本数确定。如果片段着色器入口点的接口包含使用
SampleMask
修饰的输出变量,则对于未能分配值的任何片段着色器调用的任何数组元素,样本掩码将是未定义的。如果片段着色器入口点的接口不包含使用SampleMask
修饰的输出变量,则样本掩码对片段的处理没有影响。
SamplePosition
-
使用
SamplePosition
内置修饰符修饰变量将使该变量包含正在着色的样本的子像素位置。像素的左上角被认为在坐标 (0,0),像素的右下角被认为在坐标 (1,1)。如果渲染通道具有片段密度图附件,则该变量将改为包含正在着色的样本的子片段位置。任何片段区域的左上角都被视为坐标 (0,0),而右下角被视为坐标 (1,1)。
如果片段着色器入口点的接口包含一个使用
SamplePosition
修饰的输入变量,则认为启用了样本着色,并且minSampleShading
的值为 1.0。如果当前管线使用自定义样本位置,则使用
SamplePosition
内建修饰符修饰的任何变量的值都是未定义的。
ShadingRateKHR
-
使用
ShadingRateKHR
内建修饰符修饰变量将使该变量包含当前片段调用的片段着色率。
SMCountNV
-
使用
SMCountNV
内建修饰符修饰变量将使该变量包含设备上的 SM 数量。
SMIDNV
-
使用
SMIDNV
内建修饰符修饰变量将使该变量包含当前着色器调用正在运行的 SM 的 ID。此变量的范围是 [0,SMCountNV
-1]。
SubgroupId
-
使用
SubgroupId
内建修饰符修饰变量将使该变量包含本地工作组中子组的索引。此变量的范围是 [0,NumSubgroups
-1]。
SubgroupEqMask
-
使用
SubgroupEqMask
内建修饰符修饰变量将使该变量包含当前子组调用的子组掩码。与SubgroupLocalInvocationId
对应的位在用SubgroupEqMask
修饰的变量中设置。所有其他位都设置为零。SubgroupEqMaskKHR
是SubgroupEqMask
的别名。
SubgroupGeMask
-
使用
SubgroupGeMask
内建修饰符修饰变量将使该变量包含当前子组调用的子组掩码。与大于或等于SubgroupLocalInvocationId
到SubgroupSize
-1 的调用对应的位在用SubgroupGeMask
修饰的变量中设置。所有其他位都设置为零。SubgroupGeMaskKHR
是SubgroupGeMask
的别名。
SubgroupGtMask
-
使用
SubgroupGtMask
内建修饰符修饰变量将使该变量包含当前子组调用的子组掩码。与大于SubgroupLocalInvocationId
到SubgroupSize
-1 的调用对应的位在用SubgroupGtMask
修饰的变量中设置。所有其他位都设置为零。SubgroupGtMaskKHR
是SubgroupGtMask
的别名。
SubgroupLeMask
-
使用
SubgroupLeMask
内建修饰符修饰变量将使该变量包含当前子组调用的子组掩码。与小于或等于SubgroupLocalInvocationId
的调用对应的位在用SubgroupLeMask
修饰的变量中设置。所有其他位都设置为零。SubgroupLeMaskKHR
是SubgroupLeMask
的别名。
SubgroupLtMask
-
使用
SubgroupLtMask
内置修饰符修饰一个变量,将使该变量包含当前子组调用的子组掩码。在SubgroupLtMask
修饰的变量中,小于SubgroupLocalInvocationId
的调用的对应位会被设置。所有其他位都设置为零。SubgroupLtMaskKHR
是SubgroupLtMask
的别名。
SubgroupLocalInvocationId
-
使用
SubgroupLocalInvocationId
内置修饰符修饰一个变量,将使该变量包含调用在子组内的索引。该变量的取值范围为 [0,SubgroupSize
-1]。如果指定了
VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT
,或者如果module
声明了 SPIR-V 1.6 或更高版本,并且stage
的 X 维度中的本地工作组大小是SubgroupSize
的倍数,则为该管线阶段启用完整子组。当启用完整子组时,子组必须在所有调用都处于活动状态的情况下启动,即对于范围 [0,SubgroupSize
-1] 中的每个值,都有一个具有SubgroupLocalInvocationId
的活动调用。
索引 = 如果未启用完整子组,则某些子组可能会在非活动调用时分派,这些调用不对应于本地工作组调用,从而使 index 的值不可靠。 |
当编译 SPIR-V 1.6 着色器时, |
SubgroupSize
-
使用
SubgroupSize
内置修饰符修饰一个变量,将使该变量包含实现相关的子组中的调用数。此值必须是 2 的幂的整数。如果管线是使用设置的
VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT
标志创建的,或者着色器对象是使用设置的VK_SHADER_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT
标志创建的,或者 SPIR-Vmodule
至少为 1.6 版本,则SubgroupSize
修饰的变量将包含每个被分派的子组的子组大小。此值必须介于minSubgroupSize
和maxSubgroupSize
之间,并且必须与 子组范围保持一致。该值可能在单个绘制调用中发生变化,并且对于片元着色器,可能在单个图元中发生变化。在计算分派中,SubgroupSize
必须与命令范围保持一致。如果管线是使用链式 VkPipelineShaderStageRequiredSubgroupSizeCreateInfo 结构创建的,或者着色器对象是使用链式 VkShaderRequiredSubgroupSizeCreateInfoEXT 结构创建的,则
SubgroupSize
修饰的变量将与requiredSubgroupSize
匹配。如果 SPIR-V
module
低于 1.6 版本,并且管线不是使用设置的VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT
标志创建的,并且没有链接 VkPipelineShaderStageRequiredSubgroupSizeCreateInfo 结构,并且着色器不是使用设置的VK_SHADER_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT
标志创建的,并且没有链接 VkShaderRequiredSubgroupSizeCreateInfoEXT 结构,则使用SubgroupSize
修饰的变量将与subgroupSize
匹配。实现可以支持的每个子组的最大调用数为 128。
|
TaskCountNV
-
使用
TaskCountNV
修饰一个变量将使该变量包含任务计数。任务计数指定在任务着色器完成时生成的后续网格着色器工作组的数量。
TessCoord
-
使用
TessCoord
内置修饰符修饰一个变量将使该变量包含细分顶点在面片内的三维重心坐标 (u,v,w)。u、v 和 w 的取值范围为 [0,1],并在被细分的图元上线性变化。对于Quads
或IsoLines
的细分模式,第三个分量始终为零。
TessLevelOuter
-
使用
TessLevelOuter
内建修饰符修饰的变量将包含当前面片的外部细分级别。在细分控制着色器中,可以使用
TessLevelOuter
修饰的变量进行写入,从而控制生成面片的细分因子。这些值由细分器用于控制图元细分,并且可以被细分评估着色器读取。在细分评估着色器中,可以使用
TessLevelOuter
修饰的变量读取由细分控制着色器写入的值。
TessLevelInner
-
使用
TessLevelInner
内建修饰符修饰的变量将包含当前面片的内部细分级别。在细分控制着色器中,可以使用
TessLevelInner
修饰的变量进行写入,从而控制生成面片的细分因子。这些值由细分器用于控制图元细分,并且可以被细分评估着色器读取。在细分评估着色器中,可以使用
TessLevelInner
修饰的变量读取由细分控制着色器写入的值。
VertexCountHUAWEI
-
VertexCountHUAWEI
修饰符可以用于修饰簇剔除着色器的输出变量,这个非索引模式特定的变量将包含一个整数值,指定要绘制的簇中的顶点数量。
VertexIndex
-
使用
VertexIndex
内建修饰符修饰的变量将包含当前顶点着色器调用正在处理的顶点的索引。对于非索引绘制,该变量从 vkCmdDraw 的firstVertex
参数或 vkCmdDrawIndirect 使用的结构体的firstVertex
成员开始,并且在每次绘制中为每个顶点递增 1。对于索引绘制,其值是顶点索引缓冲区的内容加上 vkCmdDrawIndexed 的vertexOffset
参数或 vkCmdDrawIndexedIndirect 使用的结构体的vertexOffset
成员。
对于每个实例, |
VertexOffsetHUAWEI
-
VertexOffsetHUAWEI
修饰符可以用于修饰簇剔除着色器的输出变量,这个索引模式特定的变量将包含一个整数值,指定一个偏移值,该偏移值在索引到顶点缓冲区之前添加到簇的顶点索引中。
ViewIndex
-
ViewIndex
修饰符可以应用于着色器输入,该输入将被填充为当前着色器调用正在处理的视图的索引。如果渲染过程中启用了多视图,则此值将是管道编译所针对的子通道的视图掩码中设置的其中一个位的索引。 如果渲染过程中未启用多视图,则此值将为零。
ViewportIndex
-
使用
ViewportIndex
内建修饰符修饰变量将使该变量包含视口的索引。在网格、顶点、细分计算或几何着色器中,可以使用视口索引写入用
ViewportIndex
修饰的变量,该视口索引是该着色器生成的图元将被定向到的视口索引。所选的视口索引用于选择视口变换、裁剪矩形和互斥裁剪矩形。
最后一个活动的预光栅化着色器阶段(按管线顺序)控制所使用的
ViewportIndex
。 即使最后一个阶段未能写入ViewportIndex
,也不会使用先前着色器阶段的输出。如果最后一个活动的预光栅化着色器阶段着色器入口点的接口不包含用
ViewportIndex
修饰的变量,并且如果未启用 multiviewPerViewViewports 功能,则使用第一个视口。如果一个 预光栅化着色器阶段着色器入口点的接口包含用ViewportIndex
修饰的变量,则它必须为给定图元的所有输出顶点写入相同的ViewportIndex
值。在片段着色器中,用
ViewportIndex
修饰的变量包含该片段调用所属的图元的视口索引。如果启用了
multiviewPerViewViewports
功能,并且最后一个活动的预光栅化着色器阶段着色器入口点的接口不包含用ViewportIndex
修饰的变量,则ViewIndex
的值将用作选择视口变换和裁剪矩形的索引,并且片段着色器中的ViewportIndex
值是未定义的。
ViewportMaskNV
-
使用
ViewportMaskNV
内建修饰符修饰变量将使该变量包含视口掩码。在网格、顶点、细分计算或几何着色器中,可以使用掩码写入用
ViewportMaskNV
修饰的变量,该掩码表示该着色器生成的图元将被定向到的哪些视口。ViewportMaskNV
变量必须是一个具有 ⌈(VkPhysicalDeviceLimits
::maxViewports
/ 32)⌉ 个元素的数组。当着色器写入此变量时,元素 M 的位 B 控制是否将图元发送到视口 32 × M + B。掩码指示的视口用于选择图元将进行变换的视口变换、裁剪矩形和互斥裁剪矩形。最后一个活动的预光栅化着色器阶段(按管线顺序)控制所使用的
ViewportMaskNV
。即使最后一个阶段未能写入ViewportMaskNV
,也不会使用先前着色器阶段的输出。当ViewportMaskNV
由最后一个预光栅化着色器阶段写入时,片段着色器中任何使用ViewportIndex
修饰的变量将具有在生成该片段时使用的视口的索引。如果一个 预光栅化着色器阶段着色器入口点的接口包含用
ViewportMaskNV
修饰的变量,则它必须为给定图元的所有输出顶点写入相同的ViewportMaskNV
值。
ViewportMaskPerViewNV
-
使用
ViewportMaskPerViewNV
内建修饰符修饰一个变量,将使该变量包含每个视口的图元广播掩码。在最后一个光栅化前着色器阶段中写入
ViewportMaskPerViewNV
元素的值是一个位掩码,指示图元将被定向到哪些视口。图元将被广播到与位掩码中每个非零位对应的视口,并且该视口索引用于为每个视图选择视口变换、剪裁矩形和排他性剪裁矩形。必须将相同的值写入给定图元中的所有顶点,否则用于该图元的视口集合是未定义的。数组的元素对应于多视图子通道中的视图,并且与着色器编译时所针对的子通道的视图掩码中的视图相对应的那些元素将用作这些视图的视口掩码值。较早的光栅化前着色器阶段中的
ViewportMaskPerViewNV
输出在随后的光栅化前着色器阶段中不可用作输入。尽管
ViewportMaskNV
是一个数组,但ViewportMaskPerViewNV
不是一个二维数组。相反,ViewportMaskPerViewNV
限制为 32 个视口。
WarpsPerSMNV
-
使用
WarpsPerSMNV
内建修饰符修饰一个变量,将使该变量包含在 SM 上执行的最大 Warp 数量。
WarpIDNV
-
使用
WarpIDNV
内建修饰符修饰一个变量,将使该变量包含当前着色器调用正在运行的 SM 上的 Warp ID。此变量的范围为 [0,WarpsPerSMNV
-1]。
WorkgroupId
-
使用
WorkgroupId
内建修饰符修饰一个变量,将使该变量包含当前调用所属的全局工作组。每个组件的范围从一个基值到一个 基值 + 计数 值,基于传递给调度命令的参数。
WorkgroupSize
SPIR-V 1.6 已弃用 |
使用 WorkgroupSize
内建修饰符修饰一个对象,将使该对象包含本地工作组的维度。如果一个对象使用 WorkgroupSize
修饰符进行修饰,则它将优先于任何 LocalSize
或 LocalSizeId
执行模式。
WorldRayDirectionKHR
-
使用
WorldRayDirectionKHR
修饰的变量将指定正在处理的光线在世界空间中的方向。该值是传递给 管线追踪光线 指令的参数。
WorldRayOriginKHR
-
使用
WorldRayOriginKHR
修饰的变量将指定正在处理的光线在世界空间中的原点。该值是传递给 管线追踪光线 指令的参数。
WorldToObjectKHR
-
使用
WorldToObjectKHR
修饰的变量将包含当前的世界到对象变换矩阵,该矩阵由当前交点的实例确定。
CoreCountARM
-
使用
CoreCountARM
内置修饰符修饰变量将使该变量包含设备上的内核数量。
CoreMaxIDARM
-
使用
CoreMaxIDARM
内置修饰符修饰变量将使该变量包含当前着色器调用正在运行的设备上任何着色器内核的最大 ID。
CoreIDARM
-
使用
CoreIDARM
内置修饰符修饰变量将使该变量包含当前着色器调用正在运行的内核的 ID。此变量的范围为 [0,CoreMaxIDARM
]。
WarpMaxIDARM
-
使用
WarpMaxIDARM
内置修饰符修饰变量将使该变量包含当前调用正在运行的内核的最大 warp ID。
WarpIDARM
-
使用
WarpIDARM
内置修饰符修饰变量将使该变量包含当前着色器调用正在运行的内核上的 warp 的 ID。此变量的范围为 [0,WarpMaxIDARM
]。
CoalescedInputCountAMDX
-
使用
CoalescedInputCountAMDX
内置修饰符修饰变量将使该变量包含实现合并到当前着色器的输入的节点分派数量。此变量的值将在 [1, arraySize) 范围内,其中 arraySize 是着色器的输入有效负载数组的最大大小。
ShaderIndexAMDX
-
使用
ShaderIndexAMDX
内置修饰符修饰一个变量,将使该变量包含编译时指定的着色器索引,可以通过 VkPipelineShaderStageNodeCreateInfoAMDX::index
或者通过ShaderIndexAMDX
执行模式来指定。