本章是对 “位置与分量分配” 章节的概述提供了相关示例尤其聚焦于一些较为特殊的边界场景。理解Location位置的最简方式是每个Location由四个 32 位的Component分量组成。这意味着vec4/float4/uvec4等四分量类型可完美适配单个Location。若多个变量的Component不重叠可将它们打包到同一个Location中。Location可用于着色器阶段间的输入Input和输出Output接口。面向普通用户的建议对于大多数开发者而言本章涉及的边界场景超出了日常使用Location接口的需求范围。针对这类开发者核心建议如下尽可能少地使用Location。若需使用多个Location需确保不超过设备限制。基础示例以下是基础使用示例layout(location0) in vec4 a; // 占用Location 0的Component 0-3 layout(location1, component 0) in vec2 b; // 占用Location 1的Component 0-1 layout(location1, component 2) in float c; // 占用Location 1的Component 216 位数据16 位数据始终会占用一整个 32 位Component。因此由 16 位元素组成的向量与 32 位元素组成的向量消耗的资源相同不会进行紧凑打包。layout(location0) in f16vec3 a; // 占用Location 0的Component 0-2每个f16占1个32位Component跨位置边界所有 16 位和 32 位向量必须完全包含在单个Location内因此以下写法是不允许的。该向量的后两个元素会试图占用component 4和component 5而这两个分量并不存在单个Location仅含 4 个分量。layout(location0, component 2) in vec4 a; // 无效vec4需4个分量从component2开始会超出Location 0的范围64 位数据64 位数据较为特殊最多可占用 2 个Location但必须从Component0 或 2 开始。layout(location0) in f64vec3 a; // 64位向量占用Location 0的Component 0-1、Location 1的Component 0分量交错以下试图让多个变量别名引用同一个分量的写法是不允许的layout(location0) in vec2 in_a; // Components 0 and 1 layout(location0, component1) in float in_f; // Invalid: overlaps component 1修改后如下写法合法多个变量可共享同一个Location但不可共享同一个Componentlayout(location0) in vec2 in_a; // 将in_f的分量改为2避免重叠 - layout(location0, component1) in float in_f; layout(location0, component2) in float in_f;数组数组的每个元素会占用与非数组形式相同数量的Location内的所有Component后续每个元素依次占用下一个可用的Location。示例如下layout(location0) in float a[3]; // a[0]占用Location 0a[1]占用Location 1a[2]占用Location 2可见使用标量或vec2/float2等类型的数组会导致许多Component槽位未被使用。允许使用数组所占用Location中未被占用的其他Component该行为在兼容 CTS 1.4.4.0 及更高版本的驱动中可保证正常工作。layout(location0) in float a[3]; // a[0]→Location0a[1]→Location1a[2]→Location2仅占用Component0 layout(location2, component2) in float b; // 合法Location2的Component2未被a[2]占用部分着色器阶段如几何着色器的接口会自带数组包装此类数组在上述示例中可忽略不影响分量分配规则。矩阵矩阵会被视为数组每个数组元素矩阵的行或列占用 4 个分量。例如layout(location 0) in mat3x2 a; // 3行2列矩阵视为3个vec2的数组从Location/Component的角度来看等价于// N 3矩阵的行数 // 数组的每个元素占用整个Location layout(location 0) in vec2 a[3]; // a[0]→Location0a[1]→Location1a[2]→Location2如前文所述数组会占用整个Location因此以下写法是不允许的layout(location 0) in mat3x2 a; // 矩阵的隐式数组占用Location0、1、2的全部分量 layout(location 2, component 2) in float b; // 无效Location2已被矩阵完全占用