Metal 着色语言编程指南 十三



紧致矢量类型 (Packed Vector Data Type)

     如前文所述, 矢量类型是有其规范的对齐方式(基于性能优化的考量).   但是你也许会有需要你所定义的矢量是被紧密地包装着的,  比如, 你定义了一个顶点的数据类型, 其成员有坐标,  法线矢量, 正切矢量和矩阵坐标,  并且希望它们是被紧密地包在一起作为给Vertex 函数的输入参数.  

    Metal 着色语言支持下面的紧致矢量类型:

    

  • packed_charn, packed_shortn, packed_intn,
    packed_ucharn, packed_ushortn, packed_uintn,
    packed_halfn, 和 packed_floatn
    下表描述了所有紧致矢量类型的大小和对齐 
  • Packed Vector Type

    Alignment (in bytes)

    sizeof (in bytes)

    packed_char2

    packed_uchar2

    1

    2

    packed_char3

    packed_uchar3

    1

    3

    packed_char4

    packed_uchar4

    1

    4

    packed_short2

    packed_ushort2

    2

    4

    packed_short3

    packed_ushort3

    2

    6

    packed_short4

    packed_ushort4

    2

    8

    packed_int2

    packed_uint2

    4

    8

    packed_int3

    packed_uint3

    4

    12

    packed_int4

    packed_uint4

    4

    16

    packed_half2

    2

    4

    packed_half3

    2

    6

    packed_half4

    2

    8

    packed_float2

    4

    8

    packed_float3

    4

    12

    packed_float4

    4

    16

    紧致矢量类型通常用于存储和host 到 device 的数据传递.  Metal 着色语言支持从紧致矢量到普通矢量的类型转换: 通过拷贝构造或者赋值运算, 反之亦然。  算数,逻辑和关系运算也适用于紧致矢量数据。  
  • 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
    




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值