Version: 2021.3

Mesh.SetVertexBufferData

切换到手册
public void SetVertexBufferData (NativeArray<T> data, int dataStart, int meshBufferStart, int count, int stream, Rendering.MeshUpdateFlags flags);
public void SetVertexBufferData (T[] data, int dataStart, int meshBufferStart, int count, int stream, Rendering.MeshUpdateFlags flags);
public void SetVertexBufferData (List<T> data, int dataStart, int meshBufferStart, int count, int stream, Rendering.MeshUpdateFlags flags);

参数

data 顶点数据数组。
dataStart 要从中进行复制的数据中的第一个元素。
meshBufferStart 用于接收数据的网格顶点缓冲区中的第一个元素。
count 要复制的顶点数。
stream 要为其设置数据的顶点缓冲区流(默认值 0)。
flags 控制函数行为的标志,请参阅 MeshUpdateFlags

描述

设置网格顶点缓冲区的数据。

Mesh 脚本 API 的简单用法涉及使用 verticesnormals 等函数设置顶点数据。

对于需要最大性能的高级用例,可以使用具有 SetSubMeshSetIndexBufferParamsSetIndexBufferDataSetVertexBufferParams 等函数的高级 API。通过此高级 API 可以访问主要适用于原始索引缓冲区、顶点缓冲区和网格子集数据的基础网格数据结构。

可以使用 SetVertexBufferData 直接设置顶点数据,而无需对每个顶点属性使用格式转换。 提供的数据布局必须匹配网格的顶点数据布局(请参阅 ::SetVertexBufferParams、 GetVertexAttributes)。还可以通过 countcountcount 参数进行数据的部分更新。

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); } }