关于网格顶点单个VertexAttribute的信息。
Mesh 顶点数据由不同的顶点属性组成。例如,一个顶点可以包含位置、法线、TexCoord0 和颜色。网格通常使用已知的格式进行数据布局,例如,位置最常见的是 3 分量的浮点向量(Vector3),但您也可以为网格指定非标准数据格式及其布局。
您可以使用VertexAttributeDescriptor
在Mesh.SetVertexBufferParams中指定自定义网格数据布局。
顶点数据以单独的“流”布局(每个流进入底层图形 API 中的单独顶点缓冲区)。Unity 支持最多四个顶点流,但您通常只使用一个流。当某些顶点属性不需要处理或您需要为顶点属性提供特定的数据布局时,单独的流最为有用。
在每个流中,顶点的属性一个接一个地排列,顺序为:VertexAttribute.Position、VertexAttribute.Normal、VertexAttribute.Tangent、VertexAttribute.Color、VertexAttribute.TexCoord0、...、VertexAttribute.TexCoord7、VertexAttribute.BlendWeight、VertexAttribute.BlendIndices。
如果在顶点数据中包含BlendWeight
或BlendIndices
属性,请使用 Unity 的默认流布局,这样 Unity 不会重新排序顶点属性或在SkinnedMeshRenderer中错误地渲染顶点。
第二个流中的所有属性都是可选的。如果未包含任何Color
或TexCoord
属性,请改为将BlendWeight
和BlendIndices
添加到第二个流中。
并非所有format 和dimension 组合都是有效的。具体来说,顶点属性的数据大小必须是 4 字节的倍数。例如,具有维度3
的VertexAttributeFormat.Float16 格式无效。其他资源:SystemInfo.SupportsVertexAttributeFormat。
var mesh = new Mesh(); // specify vertex layout with: // - floating point positions, // - half-precision (FP16) normals with two components, // - low precision (UNorm8) tangents var layout = new[] { new VertexAttributeDescriptor(VertexAttribute.Position, VertexAttributeFormat.Float32, 3), new VertexAttributeDescriptor(VertexAttribute.Normal, VertexAttributeFormat.Float16, 2), new VertexAttributeDescriptor(VertexAttribute.Tangent, VertexAttributeFormat.UNorm8, 4), }; var vertexCount = 10; mesh.SetVertexBufferParams(vertexCount, layout);
与该顶点布局匹配的 C# 结构体(用于Mesh.SetVertexBufferData)可能如下所示
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)] struct ExampleVertex { public Vector3 pos; public ushort normalX, normalY; public Color32 tangent; }
VertexAttributeDescriptor | 创建一个 VertexAttributeDescriptor 结构体。 |