iOS 开发每天分享优质文章

Metal Shadeing Language(2)

2018-07-31  本文已影响131人  CC老师_HelloCoder

三.Metal的数据类型

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

3.1 标量数据类型

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

Metal 数据类型

3.2 向量和矩阵数据类型

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

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);

注意:

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);
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);

上一篇 下一篇

猜你喜欢

热点阅读