BlendShapeBufferLayout.PerVertex
Описание
Упорядочить данные по вершинам сетки.
Когда вы вызываете Mesh.GetBlendShapeBuffer с этой опцией, она возвращает GraphicsBuffer, содержащий данные вершин формы смешивания, упорядоченные по вершинам сетки.
В этом буфере каждая вершина формы смешивания состоит из:
- Целое число, представляющее индекс формы смешивания, к которой относятся эти данные.
- Vector3, который представляет позиционную дельту.
- Vector3, который представляет нормальную дельту.
- Vector3, который представляет дельту касательной.
В этом буфере точный расклад зависит от количества вершин сетки. Он работает следующим образом:
- Элементы от 0 до (число вершин сетки + 1) содержат индексы. Эти индексы описывают начальную и конечную позиции данных в остальной части буфера, упорядоченные по вершинам сетки. Например, элемент 0 является начальной позицией данных для вершины сетки 0; элемент 1 является конечной позицией данных для вершины сетки 0 и начальной позицией данных для вершины сетки 1 и так далее.
- Элемент с индексом (количество вершин меша + 1) описывает конечную позицию данных для последней вершины меша.
- После этого вершины формы смешивания, относящиеся к каждой вершине сетки, хранятся непрерывно. Например, все вершины формы смешивания, относящиеся к вершине сетки 0, являются непрерывными, затем следуют все вершины формы смешивания, относящиеся к вершине сетки 1, и так далее.
Данные о вершинах смешанной формы хранятся в виде массива 32-битных значений. Вы должны вручную преобразовать данные в соответствующий тип.
Unity не создает этот буфер при первом создании сетки. Вместо этого он создает этот буфер по требованию при первом доступе к нему. Это означает, что при первом доступе к буферу выделяются CPU и GPU выделения памяти.
using UnityEngine; using UnityEngine.Rendering;
public class Example : MonoBehaviour { public Mesh mesh; public ComputeShader computeShader;
void Start() { // Fetch GraphicsBuffer with Blend Shape data, ordered per vertex, from the mesh var perVertexBuffer = mesh.GetBlendShapeBuffer(BlendShapeBufferLayout.PerVertex);
// Set Blend Shape data buffer to a compute shader computeShader.SetBuffer(0, "PerVertex_BlendShapeBuffer", perVertexBuffer);
// Dispatch compute shader and access Blend Shape Data on the GPU computeShader.Dispatch(0, 64, 1, 1);
// Dispose of GraphicsBuffer to avoid leaking memory perVertexBuffer.Dispose(); } }
Дополнительные ресурсы: Данные сетки: объединенные формы, Mesh.GetBlendShapeBuffer, QualitySettings.skinWeights.