Metal Shadeing Language(2)

作者: CC老师_HelloCoder | 来源:发表于2018-07-31 16:49 被阅读131次

    三.Metal的数据类型

    Metal的数据类型包含表示向量和矩阵的类型,原子数据类型,缓存,纹理,采样器,数组,自定义结构体,还会描述类型对齐和类型转换.

    3.1 标量数据类型

    Metal 支持如下表格的类型,但是它不支持double,long,unsigned long ,long long,unsigned long long,long double

    Metal 数据类型
    • 注意
      • f或者F,表示单精度浮点类型字面量,(例如,0.5f 或 0.5F);
      • h或者H,表示半单精度浮点类型字面量,(例如,0.5h 或 0.5H);
      • u或者U,表示无符号整形字面量.

    3.2 向量和矩阵数据类型

    Metal着色语言通过系统向量数学库支持一系列的向量和矩阵数据类型.

    • 向量支持如下类型

      • booln
      • charn
      • shortn
      • intn
      • ucharn
      • ushortn
      • uintn
      • halfn
      • floatn
    • 向量中的n,指的是维度.假设2,表示二维

    • 矩阵支持如下类型

      • halfnxm
      • floatnxm
    • nxm分别指的是矩阵的行数和列数.

    3.3 访问向量的分量

    向量的分量可以使用数组下标进行访问存取.

    #include <metal_stdlib>
    using namespace metal;
    
    //基本数据类型
    bool a = true;
    char b = 5;
    int  d = 15;
    size_t c = 1;
    ptrdiff_t f = 2;
    
    //向量
    bool2 A= [1,2];
    float4 pos = float4(1.0,2.0,3.0,4.0);
    float x = pos[0];
    float y = pos[1];
    
    float4 VB;
    for(int i = 0; i < 4 ; i++)
        VB[i] = pos[i] * 2.0f;
    
    
    

    Metal 支持(,)作为选择向量分量进行访问操作符.可以使用坐标分量或者是颜色分量的字母来存取向量.向量名.xyzw,或是向量名.rgba;

    //通过向量字母来获取元素
    int4 test = int4(0,1,2,3,4);
    int a = test.x;
    int b = test.y;
    int c = test.z;
    int d = test.w;
    
    int e = test.r;
    int f = test.g;
    int g = test.b;
    int h = test.a;
    
    
    • 分量语法也能允许多个分量同时被选择访问.
    
    float4 c;
    c.xyzw = float4(1.0f,2.0f,3.0f,4.0f);
    c.z = 1.0f;
    c.xy = float2(3.0f,4.0f);
    c.xyz = float3(3.0f,4.0f,5.0f);
    
    
    • 分量选择语法允许多个分量乱序或是重复出现
    float4 pos = float4(1.0f,2.0f,3.0f,4.0f);
    float4 swiz = pos.wxyz;  //swiz = (4.0,1.0,2.0,3.0);
    float4 dup = pos.xxyy;  //dup = (1.0f,1.0f,2.0f,2.0f);
    
    //pos = (5.0f,2.0,3.0,6.0)
    pos.xw = float2(5.0f,6.0f);
    
    //pos = (8.0f,2.0f,3.0f,7.0f)
    pos.wx = float2(7.0f,8.0f);
    
    //pos = (3.0f,5.0f,9.0f,7.0f);
    pos.xyz = float3(3.0f,5.0f,9.0f);
    

    注意:

    • 用如下的向量分量访问方法是不被允许的会导致编译错误

      • 访问分量时,如果超过了向量声明的维度数会产生错误.一个2维向量可以通过xy,或者rg范围访问其分量.一个3维向量可以通过.xyz或者.rgb 访问其分量.
    float2 pos;
    pos.x = 1.0f; //合法
    pos.z = 1.0f; //非法
    
    float3 pos2;
    pos2.z = 1.0f; //合法
    pos2.w = 1.0f; //非法
    
    
    • 作为一个左值,同一个分量出现多余一次是错误.
    //非法,x出现2次
    pos.xx = float2(3.0,4.0f);
    //不合法-使用混合限定符
    pos.xy = float4(1.0f,2.0,3.0,4.0);
    
    • .rgba.xyzw 不能在同一次访问中使用.
    float4 pos4 = float4(1.0f,2.0f,3.0f,4.0f);
    pos.x = 1.0f;
    pos.y = 2.0f;
    //非法,.rgba与.xyzw 混合使用
    pos.xg = float2(2.0f,3.0f);
    ////非法,.rgba与.xyzw 混合使用
    float3 coord = pos.ryz;
    
    
    • 指向向量分量的指针或者引用也是不合法的.
    float4 pos5 = float4(1.0f,2.0f,3.0f,4.0f);
    //非法,使用指针来指向向量/分量
    my_func(&pos5.xy);
    
    

    相关文章

      网友评论

        本文标题:Metal Shadeing Language(2)

        本文链接:https://www.haomeiwen.com/subject/cbmhvftx.html