紧致矢量类型 (Packed Vector Data Type)
如前文所述, 矢量类型是有其规范的对齐方式(基于性能优化的考量). 但是你也许会有需要你所定义的矢量是被紧密地包装着的, 比如, 你定义了一个顶点的数据类型, 其成员有坐标, 法线矢量, 正切矢量和矩阵坐标, 并且希望它们是被紧密地包在一起作为给Vertex 函数的输入参数.
Metal 着色语言支持下面的紧致矢量类型:
下表描述了所有紧致矢量类型的大小和对齐packed_charn, packed_shortn, packed_intn, packed_ucharn, packed_ushortn, packed_uintn, packed_halfn, 和 packed_floatn-
紧致矢量类型通常用于存储和host 到 device 的数据传递. Metal 着色语言支持从紧致矢量到普通矢量的类型转换: 通过拷贝构造或者赋值运算, 反之亦然。 算数,逻辑和关系运算也适用于紧致矢量数据。Packed Vector Type
Alignment (in bytes)
sizeof (in bytes)
packed_char2packed_uchar21
2
packed_char3packed_uchar31
3
packed_char4packed_uchar41
4
packed_short2packed_ushort22
4
packed_short3packed_ushort32
6
packed_short4packed_ushort42
8
packed_int2packed_uint24
8
packed_int3packed_uint34
12
packed_int4packed_uint44
16
packed_half22
4
packed_half32
6
packed_half42
8
packed_float24
8
packed_float34
12
packed_float44
16
device float4 *buffer; device packed_float4 *packed_buffer; int i; packed_float4 f ( buffer[i] ); pack_buffer[i] = buffer[i]; // operator to convert from packed_float4 to float4. buffer[i] = float4( packed_buffer[i] );
- 紧致矢量数据的成员可以用索引的方式进行访问, 但是不支持 .xyzw 和 .rgba 访问方式, 这一点同普通的矢量数据不同。
packed_float4 f; f[0] = 1.0f; // OK f.x = 1.0f; // Illegal - compilation error

本文详细介绍了Metal着色语言中的紧致矢量类型及其使用场景,包括各种紧致矢量类型的对齐方式和大小,并说明了这些类型如何用于存储和host到device的数据传递,同时提供了类型转换的方法。
1112

被折叠的 条评论
为什么被折叠?



