顶点数据的元素称为顶点属性。
每个顶点都可以具有以下属性:
在内部,所有顶点数据都存储在相同大小的单独数组中。如果您的网格包含具有 10 个顶点位置的数组,则对于它使用的每个其他顶点属性,它也有具有 10 个元素的数组。
在 C# 中,Unity 使用 VertexAttribute 枚举描述了可用的顶点属性。您可以使用 Mesh.HasVertexAttribute 函数检查 Mesh 类的实例是否具有给定的顶点属性。
顶点位置表示顶点在对象空间中的位置。
Unity 使用此值来确定网格的表面。
所有网格都需要此顶点属性。
在 Mesh 类中,要想访问此数据,最简单的方法是使用 Mesh.GetVertices 和 Mesh.SetVertices。Unity 也会将此数据存储在 Mesh.vertices 中,但此旧属性的效率较低,而且对用户不太友好。
顶点法线表示从顶点位置处的表面直接“伸出”的方向。
Unity 使用此值来计算光从网格表面反射的方式。
此顶点属性是可选属性。
在 Mesh 类中,要想访问此数据,最简单的方法是使用 Mesh.GetNormals 和 Mesh.SetNormals。Unity 也会将此数据存储在 Mesh.normals 中,但此旧属性的效率较低,而且对用户不太友好。
顶点切线表示沿着顶点位置处表面的“u”(水平纹理)轴指向的方向。
Unity 将顶点切线与附加数据一起存储在四分量矢量中。矢量的 x、y、z 分量描述切线,矢量的 w 分量描述其方向。Unity 使用 w 值来计算双法线,这是切线和法线的差乘。
Unity 使用法线贴图中的切线和双法线值。
此顶点属性是可选属性。
在 Mesh 类中,要想访问此数据,最简单的方法是使用 Mesh.GetTangents 和 Mesh.SetTangents。Unity 也会将此数据存储在 Mesh.tangents 中,但此旧属性的效率较低,而且对用户不太友好。
一个网格最多可以包含八组纹理坐标。纹理坐标通常称为 UV,而集合称为通道。
Unity 在将纹理“封装”在网格周围时使用纹理坐标。UV 指示纹理的哪个部分在顶点位置与网格表面对齐。
UV 通道通常将第一个通道称为“UV0”,将第二个通道称为“UV1”,依此类推,直至“UV7”。通道分别映射到着色器语义 TEXCOORD0、TEXCOORD1 等,直至 TEXCOORD7。
默认情况下,Unity 使用第一个通道 (UV0) 来存储常规纹理(例如漫射贴图和镜面反射贴图)的 UV。Unity 可以使用第二个通道 (UV1) 存储烘焙光照贴图 UV,并使用第三个通道 (UV2) 存储实时光照贴图 UV 的输入数据。有关光照贴图 UV 以及 Unity 如何使用这些通道的更多信息,请参阅光照贴图 UV。
所有八个纹理坐标属性都是可选属性。
在 Mesh 类中,要想访问此数据,最简单的方法是使用 Mesh.GetUVs 和 Mesh.SetUVs。Unity 还会将此数据存储在以下属性中:Mesh.uv、Mesh.uv2、Mesh.uv3 等,最高到 Mesh.uv8。请注意,这些旧属性的效率较低,而且对用户不太友好。
顶点颜色表示顶点的基色(如果有)。
此颜色独立于网格可能使用的任何纹理。
此顶点属性是可选属性。
在 Mesh 类中,要想访问此数据,最简单的方法是使用 Mesh.GetColors 和 Mesh.SetColors。Unity 也会将此数据存储在 Mesh.colors 中,但此旧属性的效率较低,而且对用户不太友好。
在蒙皮网格中,混合索引指示哪些骨骼会影响顶点,而骨骼权重描述这些骨骼对顶点的影响程度。
在 Unity 中,这些顶点属性存储在一起。
Unity 使用混合索引和骨骼权重根据蒙皮网格骨架的移动对蒙皮网格进行变形。有关更多信息,请参阅带蒙皮的网格渲染器。
蒙皮网格需要这些顶点属性。
过去,Unity 最多只允许 4 个骨骼影响一个顶点。它以前将此数据存储在 BoneWeight 结构中,即 Mesh.boneWeights 数组中。现在,Unity 最多允许 256 个骨骼影响一个顶点。它现在将此数据存储在 BoneWeight1 结构中,您可以使用 Mesh.GetAllBoneWeights 和 Mesh.SetBoneWeights 访问此数据。有关更多信息,请参阅链接的 API 文档。