版本:Unity 6 (6000.0)
语言英语
  • C#

Mesh.GetNativeVertexBufferPtr

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交,但我们确实会阅读用户提出的每个建议更改,并在适用的情况下进行更新。

关闭

提交失败

由于某些原因,您的建议更改无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

切换到手册

声明

public IntPtr GetNativeVertexBufferPtr(int index);

参数

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

返回值

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

描述

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

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

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

顶点缓冲区的数据布局通常取决于许多因素,特别是对于压缩的网格(请参阅 播放器设置 > 网格压缩设置)并标记为不可读的网格。对于简单的情况,布局通常如下所示

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

您可以使用 HasVertexAttributeGetVertexAttributeOffsetGetVertexBufferStride 方法查询有关网格顶点属性布局的信息。

返回的数据类型取决于底层图形 API

  • D3D11 上的 ID3D11Buffer
  • D3D12 上的 ID3D12Resource
  • Metal 上的 id<MTLBuffer>
  • OpenGL/ES 上的缓冲区“名称”(作为 GLuint)
  • Vulkan 上的内部表示,应通过 IUnityGraphicsVulkan 接口访问

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

请注意,在使用多线程渲染时调用此函数将与渲染线程同步(一项缓慢的操作),因此最佳实践是在初始化时仅设置必要的缓冲区指针。

其他资源:原生代码插件GetNativeIndexBufferPtrvertexBufferCountvertexCount