Mesh.GetNativeVertexBufferPtr

Switch to Manual
public IntPtr GetNativeVertexBufferPtr (int index);

Parameters

bufferIndex要获取的顶点缓冲区(某些网格可能有多个)。请参阅 vertexBufferCount

Returns

IntPtr 指向底层图形 API 顶点缓冲区的指针。

Description

检索指向顶点缓冲区的原生(底层图形 API)指针。

使用此函数可检索与网格顶点缓冲区对应的指针/句柄, 因为它以原生图形 API 表示。这可以用于通过 本机代码插件启用网格操作。

大多数网格只包含一个顶点缓冲区,但是某些网格(如某些平台上的蒙皮网格) 可能包含多个缓冲区。使用 vertexBufferCount 可查询顶点缓冲区计数。

顶点缓冲区的数据布局通常取决于一些因素,特别是对于 经过压缩(请参阅 Player Settings > Mesh Compression Settings)并且标记为不可读的网格。 对于简单情况,布局通常如下所示:

float3 position (12 bytes)
float3 normal (12 bytes)
byte4 color32 (4 bytes) or float4 color (16 bytes)
float2|float3|float4 uv (8, 12 or 16 bytes)
float2|float3|float4 uv2 (8, 12 or 16 bytes)
float2|float3|float4 uv3 (8, 12 or 16 bytes)
float2|float3|float4 uv4 (8, 12 or 16 bytes)
float4 tangent (16 bytes)

所有顶点组件都是可选的,例如一个网格可能只包含位置 + 法线 + 一个 2D 纹理坐标。 在这种情况下,缓冲区中的顶点数据大小会是 12+12+8=32 字节。

返回的数据类型取决于底层图形 API:
- D3D9 上的 IDirect3DIndexBuffer9
- D3D11 上的 ID3D11Buffer
- D3D12 上的 ID3D12Resource
- OpenGL/ES 上的缓冲区“名称”(作为 GLuint)
- Metal 上的 id<MTLBuffer>


对于大多数用例(即从本机代码写入网格数据),需要在获取原生缓冲区指针之前, 将网格标记为“动态”(请参阅 MarkDynamic)。通常这会将缓冲区切换为 CPU 可写入。

注意,在使用多线程渲染时调用此函数将与正在渲染的线程 (慢速操作)同步,因此最佳做法是仅在初始化时设置所需的缓冲区指针。

另请参阅: 本机代码插件GetNativeIndexBufferPtrvertexBufferCountvertexCount