Mesh.GetNativeVertexBufferPtr
Declaration
public IntPtr GetNativeVertexBufferPtr(int index);Параметры
| Параметр | Описание |
|---|---|
| индекс | Какой вершинный буфер получить (некоторые меши могут иметь более одного). См. vertexBufferCount. |
Возвращаемое значение
IntPtr Указатель на базисный графический API вершинный буфер.
Описание
Получает собственный (базовый график API) указатель на буфер вершин.
Используйте эту функцию для получения указателя/управляющего элемента, соответствующего вершинному буферу меши, как он представлен в нативной графике API. Это может быть использовано для разрешения манипуляции Mesh из нативных плагинов.
Большинство Mesh содержат только один вершинный буфер, но некоторые (например, Skinned Mesh на некоторых платформах) могут содержать более одного. Используйте vertexBufferCount для запроса количества вершинных буферов.
Расположение данных в вершинном буфере обычно зависит от ряда факторов, особенно для Mesh, которые сжаты (см. Настройки проигрывателя > Настройки сжатия Mesh) и помечены как нечитаемые. Для простого случая, обычно макет выглядит следующим образом:float3 position (12 байт)
float3 normal (12 байт)
byte4 color32 (4 байта) или float4 color (16 байт)
float2|float3|float4 uv (8, 12 или 16 байт)
float2|float3|float4 uv2 (8, 12 или 16 байт)
float2|float3|float4 uv3 (8, 12 или 16 байт)
float2|float3|float4 uv4 (8, 12 или 16 байт)
float4 tangent (16 байт)
Все вершинные компоненты являются необязательными, например, Mesh может содержать только позицию + нормальную + одну координату текстуры 2D. В этом случае размер данных вершины в буфере будет 12+12+8=32 байта.
Вы можете использовать методы HasVertexAttribute, GetVertexAttributeOffset, GetVertexBufferStride для запроса информации о расположении атрибутов вершин Меши.
Тип возвращаемых данных зависит от базовой графики API:
- ID3D11Buffer на D3D11
- ID3D12Resource на D3D12
- id<MTLBuffer> на Metal
- буфер "имя" (как GLuint) на OpenGL/ES
- внутреннее представление в Vulkan, к которому следует обращаться через интерфейс IUnityGraphicsVulkan
Для большинства сценариев использования (i.e. запись Mesh данных из нативного кода), необходимо пометить сетку как "динамическую" (см. MarkDynamic) перед получением указателя на буфер. Обычно это переключает буферы, которые должны быть CPU-записываемый.
Обратите внимание, что вызов этой функции при использовании многопоточного рендеринга будет синхронизироваться с потоком рендеринга (медленная операция), поэтому лучшим решением является установка необходимых указателей буфера только во время инициализации.
Дополнительные ресурсы: Плагины с нативным кодом, GetNativeIndexBufferPtr, vertexBufferCount, vertexCount.