Metal Shadeing Language(2)

三.Metal的數(shù)據(jù)類(lèi)型

Metal的數(shù)據(jù)類(lèi)型包含表示向量和矩陣的類(lèi)型,原子數(shù)據(jù)類(lèi)型,緩存,紋理,采樣器,數(shù)組,自定義結(jié)構(gòu)體,還會(huì)描述類(lèi)型對(duì)齊和類(lèi)型轉(zhuǎn)換.

3.1 標(biāo)量數(shù)據(jù)類(lèi)型

Metal 支持如下表格的類(lèi)型,但是它不支持double,long,unsigned long ,long long,unsigned long long,long double

Metal 數(shù)據(jù)類(lèi)型
  • 注意
    • f或者F,表示單精度浮點(diǎn)類(lèi)型字面量,(例如,0.5f 或 0.5F);
    • h或者H,表示半單精度浮點(diǎn)類(lèi)型字面量,(例如,0.5h 或 0.5H);
    • u或者U,表示無(wú)符號(hào)整形字面量.

3.2 向量和矩陣數(shù)據(jù)類(lèi)型

Metal著色語(yǔ)言通過(guò)系統(tǒng)向量數(shù)學(xué)庫(kù)支持一系列的向量和矩陣數(shù)據(jù)類(lèi)型.

  • 向量支持如下類(lèi)型

    • booln
    • charn
    • shortn
    • intn
    • ucharn
    • ushortn
    • uintn
    • halfn
    • floatn
  • 向量中的n,指的是維度.假設(shè)2,表示二維

  • 矩陣支持如下類(lèi)型

    • halfnxm
    • floatnxm
  • nxm分別指的是矩陣的行數(shù)和列數(shù).

3.3 訪問(wèn)向量的分量

向量的分量可以使用數(shù)組下標(biāo)進(jìn)行訪問(wèn)存取.

#include <metal_stdlib>
using namespace metal;

//基本數(shù)據(jù)類(lèi)型
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 支持(,)作為選擇向量分量進(jìn)行訪問(wèn)操作符.可以使用坐標(biāo)分量或者是顏色分量的字母來(lái)存取向量.向量名.xyzw,或是向量名.rgba;

//通過(guò)向量字母來(lái)獲取元素
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;

  • 分量語(yǔ)法也能允許多個(gè)分量同時(shí)被選擇訪問(wèn).

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

  • 分量選擇語(yǔ)法允許多個(gè)分量亂序或是重復(fù)出現(xiàn)
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);

注意:

  • 用如下的向量分量訪問(wèn)方法是不被允許的會(huì)導(dǎo)致編譯錯(cuò)誤

    • 訪問(wèn)分量時(shí),如果超過(guò)了向量聲明的維度數(shù)會(huì)產(chǎn)生錯(cuò)誤.一個(gè)2維向量可以通過(guò)xy,或者rg范圍訪問(wèn)其分量.一個(gè)3維向量可以通過(guò).xyz或者.rgb 訪問(wèn)其分量.
float2 pos;
pos.x = 1.0f; //合法
pos.z = 1.0f; //非法

float3 pos2;
pos2.z = 1.0f; //合法
pos2.w = 1.0f; //非法

  • 作為一個(gè)左值,同一個(gè)分量出現(xiàn)多余一次是錯(cuò)誤.
//非法,x出現(xiàn)2次
pos.xx = float2(3.0,4.0f);
//不合法-使用混合限定符
pos.xy = float4(1.0f,2.0,3.0,4.0);
  • .rgba.xyzw 不能在同一次訪問(wèn)中使用.
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);
//非法,使用指針來(lái)指向向量/分量
my_func(&pos5.xy);

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容