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 可写入。
注意,在使用多线程渲染时调用此函数将与正在渲染的线程
(慢速操作)同步,因此最佳做法是仅在初始化时设置所需的缓冲区指针。
另请参阅: 本机代码插件、GetNativeIndexBufferPtr、vertexBufferCount、vertexCount。