US2S3L4——Swizzle操作符

Swizzle操作符

上节课我们学习了向量,但是我们并没有讲解如何获取向量中某元素的相关知识点
而这节课将要学习的Swizzle操作符就可以用于获取向量中元素

Swizzle操作符通常以点号( .​ )的形式使用,后面跟着所需的分量顺序

对于四维向量来说,我们可以通过:向量.xyzw​ 或 向量.rgba
两种分量的写法来表示向量中的四个值

其中 xyzw​ 和 rgba​ 分别代表四维向量中的四个元素
在此的意义就是向量一般可以用来表示坐标和颜色

  1. 向量获取元素可以利用Swizzle操作符获取
  2. 矩阵获取元素和二维数组获取方式一样
  3. Swizzle操作符可以让我们对向量进行方便的操作
  4. 向量和矩阵在声明和获取时可以配合使用
  5. 高维向量或矩阵可以用低维容器装载,可以利用这个特点将4维变3维,4x4变3x3

Swizzle操作符使用方法

  1. 利用它来提取分量,使用 xyzw​ 或 rgba

    1
    2
    3
    4
    5
    6
    7
    8
    9
    fixed4 f4 = fixed4(1, 2, 3, 4);
    fixed f;
    //提取第一个分量
    f = f4.x;
    f = f4.r;
    //提取第二个分量
    f = f4.y;
    f = f4.g;
    //以此类推,第三个分量就是f4.z或f4.b,第四个分量就是f4.w或f4.a
  2. 利用它来重新排列分量

    1
    2
    3
    4
    5
    fixed4 f4 = fixed4(1, 2, 3, 4);

    //重新排列分量
    f4 = f4.yzxw; //fixed4(2, 3, 1, 4)
    f4 = f4.abgr; //fixed4(4, 1, 3, 2)
  3. 利用它来创建新向量

    可以用高维向量声明低维向量(指定需要哪些分量),使用低维向量声明高维向量(需要补全相应分量)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    fixed4 f4 = fixed4(1, 2, 3, 4);
    fixed f = f4.g; //2

    //创建新的向量
    fixed3 f3 = f4.xyz; //fixed3(4, 1, 3)
    fixed2 f2 = f3.xz; //fixed2(4, 3)
    fixed4 f4_2 = fixed4(f2, 4, 5); //fixed4(4, 3, 4, 5)
    fixed4 f4_3 = fixed4(f2, f2); //fixed4(4, 3, 4, 3)
    f4_2 = fixed4(f3, f); //fixed4(4, 1, 3, 2)

向量和矩阵的更多用法

  1. 利用向量声明矩阵

    在声明矩阵时,我们可以配合向量来进行声明

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    fixed4 f4 = fixed4(1, 2, 3, 4);

    fixed4x4 f4x4 = { fixed4(1, 2, 3, 4),
    fixed4(5, 6, 7, 8),
    fixed4(9, 10, 11, 12),
    fixed4(13, 14, 15, 16) };

    fixed4x4 f4x4_2 = { f4,
    f4,
    f4,
    f4 };
  2. 获取矩阵中的元素

    矩阵中元素的获取和二维数组一样

    1
    2
    3
    4
    5
    6
    fixed4x4 f4x4 = { fixed4(1, 2, 3, 4),
    fixed4(5, 6, 7, 8),
    fixed4(9, 10, 11, 12),
    fixed4(13, 14, 15, 16) };

    fixed f = f4x4[0][0];
  3. 利用向量获取矩阵中的某一行

    我们可以用向量作为容器存储矩阵中的某一行

    1
    2
    3
    4
    5
    6
    fixed4x4 f4x4 = { fixed4(1, 2, 3, 4),
    fixed4(5, 6, 7, 8),
    fixed4(9, 10, 11, 12),
    fixed4(13, 14, 15, 16) };

    fixed4 f4_2 = f4x4[3];
  4. 高维转低维

    向量和矩阵都可以用低维存高维,会自动舍去多余元素

    对于高维转低维的向量来说,会直接使用前面对应个数的元素
    对于高维转低维的矩阵,会直接使用前面对应维数的元素

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    fixed4 f4 = fixed4(1, 2, 3, 4);
    fixed4x4 f4x4 = { fixed4(1, 2, 3, 4),
    fixed4(5, 6, 7, 8),
    fixed4(9, 10, 11, 12),
    fixed4(13, 14, 15, 16) };

    fixed3 f3_2 = f4; //f4.xyz
    fixed2 f2_2 = f4; //f4.xy

    fixed3x3 f3x3 = f4x4; //f4x4[0,1,2][0,1,2]
    fixed4x4 f2x2 = f4x4; //f4x4[0,1][0,1]