Version: 2021.3

Mesh.GetNativeVertexBufferPtr

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

参数

index 要获取的顶点缓冲区(某些网格可能有多个)。请参阅 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 字节。

You can use HasVertexAttribute, GetVertexAttributeOffset, GetVertexBufferStride methods to query information about the vertex attribute layout of the Mesh.

返回的数据类型取决于底层图形 API: D3D11 上的 ID3D11Buffer D3D12 上的 ID3D12Resource Metal 上的 id<MTLBuffer> OpenGL/ES 上的缓冲区“名称”(作为 GLuint) internal representation on Vulkan, that should be accessed via IUnityGraphicsVulkan interface 对于大多数用例(即从本机代码写入网格数据),需要在获取原生缓冲区指针之前, 将网格标记为“动态”(请参阅 MarkDynamic)。通常这会将缓冲区切换为 CPU 可写入。

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

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