数据 | 顶点数据数组。 |
dataStart | 要从其复制的第一个数据元素。 |
meshBufferStart | 接收数据的网格顶点缓冲区中的第一个元素。 |
计数 | 要复制的顶点数。 |
流 | 要为其设置数据的顶点缓冲区流(默认 0)。值必须在 0 到 3 的范围内。 |
标志 | 控制函数行为的标志,请参阅 MeshUpdateFlags。 |
设置网格顶点缓冲区的数据。
简单地使用 网格 脚本 API 涉及使用 顶点、法线 等函数来设置顶点数据。
对于需要最大化性能的高级用例,您可以使用高级 API,其中有 SetSubMesh、SetIndexBufferParams、SetIndexBufferData 和 SetVertexBufferParams 这样的函数。此高级 API 提供了对主要处理原始索引缓冲区、顶点缓冲区和网格子集数据的底层网格数据结构的访问。
您可以使用 SetVertexBufferData
直接设置顶点数据,而无需使用每个顶点属性的格式转换。所提供的 data 布局必须与网格的顶点数据布局匹配(请参阅 SetVertexBufferParams、GetVertexAttributes)。还可以通过 dataStart
、meshBufferStart
、count
参数对数据进行部分更新。
using UnityEngine; using UnityEngine.Rendering; using Unity.Collections;
public class Example : MonoBehaviour { // Vertex with FP32 position, FP16 2D normal and a 4-byte tangent. // In some cases StructLayout attribute needs // to be used, to get the data layout match exactly what it needs to be. [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)] struct ExampleVertex { public Vector3 pos; public ushort normalX, normalY; public Color32 tangent; }
void Start() { var mesh = new Mesh(); // specify vertex count and layout 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);
// set vertex data var verts = new NativeArray<ExampleVertex>(vertexCount, Allocator.Temp);
// ... fill in vertex array data here...
mesh.SetVertexBufferData(verts, 0, 0, vertexCount); } }