Version: 2020.1

Mesh.GetNativeVertexBufferPtr

切换到手册
public IntPtr GetNativeVertexBufferPtr (int index);

参数

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

返回

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

描述

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

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

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

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

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 字节)

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

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


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

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

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

Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961