Metal Shading Language
Metal Shading Language是用來(lái)編寫(xiě)
3D圖形渲染邏輯和并行計(jì)算核心邏輯的一門(mén)編程語(yǔ)言。當(dāng)使用Metal框架來(lái)實(shí)現(xiàn)APP邏輯時(shí),需要使用到Metal語(yǔ)言Metal使用Clang 和 LLVM來(lái)編譯
Metal是基于C++ 11.0語(yǔ)言設(shè)計(jì)
Metal 和 C++ 11.0的異同
- C++ 11.0在Metal中不支持之處
1.Lambda表達(dá)式
2.遞歸函數(shù)調(diào)用
3.動(dòng)態(tài)轉(zhuǎn)換操作符
4.類(lèi)型識(shí)別
5.對(duì)象創(chuàng)建 new和銷(xiāo)毀 delete操作符
6.操作符noexcept,告訴編譯器函數(shù)內(nèi)部不會(huì)發(fā)生異常
7.goto跳轉(zhuǎn)
8.變量存儲(chǔ)修飾符register和thread_local
9.虛函數(shù)修飾符
10.派生類(lèi)
11.異常處理
12.C++標(biāo)準(zhǔn)函數(shù)在Metal中不可使用
- Metal中對(duì)于指針使用的限制
- 函數(shù)參數(shù)如果是指針必須使用地址空間修飾符(device, threadgroup, constant)
2.不支持指針函數(shù)
3.函數(shù)名中不能出現(xiàn)main
- Metal中紋理和幀緩沖區(qū)的像素使用的坐標(biāo)系統(tǒng)原點(diǎn)在左上角
Metal 標(biāo)量數(shù)據(jù)類(lèi)型
- bool, true/false
- char 有符號(hào)8位整數(shù)
- unsigned char / uchar 無(wú)符號(hào)8-bit整數(shù)
- short 有符號(hào)16-bit整數(shù)
- unsigned short / ushort 無(wú)符號(hào)32-bit整數(shù)
- half 16位bit浮點(diǎn)數(shù)
- float 32位bit浮點(diǎn)數(shù)
- size_t 64位無(wú)符號(hào)整數(shù)
- void
函數(shù)修飾符
kernel:表示該函數(shù)是一個(gè)數(shù)據(jù)并行計(jì)算著色函數(shù),它可以被分配在一維/二維/三維線(xiàn)程組中去執(zhí)行
vertex:表示該函數(shù)是一個(gè)頂點(diǎn)著色函數(shù)
fragment:表示該函數(shù)是一個(gè)片元著色函數(shù)
note:使用kernel修飾的函數(shù)返回值必須是void
note:不能在被函數(shù)修飾符修飾的函數(shù)中,調(diào)用其他被函數(shù)修飾符修飾的函數(shù),這會(huì)導(dǎo)致編譯失敗
紋理Textures類(lèi)型
enum class access { sample, read, write };
texture1d<T, access a = access::sample>
texture1d<T, access a = access::sample>
texture1d<T, access a = access::sample>
T指從紋理中讀取數(shù)據(jù)的數(shù)據(jù)類(lèi)型,可以是 half/float/short/int等
采樣器類(lèi)型Samplers
采樣器類(lèi)型決定了如何對(duì)一個(gè)紋理進(jìn)行采樣,在Metal框架中有一個(gè)對(duì)應(yīng)著色器語(yǔ)言的采樣器對(duì)象MTLSamplerState,這個(gè)對(duì)象作為圖形著色器渲染函數(shù)或并行計(jì)算函數(shù)的參數(shù)傳入。
enum class coord { normalized, pixel }
從紋理中采樣時(shí),紋理坐標(biāo)是否需要?dú)w一化
enum class filter { nearest, linear }
紋理采樣過(guò)濾方式,放大/縮小過(guò)濾方式
enum class min_filter { normalized, pixel }
設(shè)置紋理采樣的縮小過(guò)濾方式
enum class mag_filter { normalized, pixel }
設(shè)置紋理采樣的放大過(guò)濾方式
enum class s_address { clamp_to_zero, clamp_to_edge, repeat, mirrored_repeat }
enum class t_address { clamp_to_zero, clamp_to_edge, repeat, mirrored_repeat }
enum class r_address { clamp_to_zero, clamp_to_edge, repeat, mirrored_repeat }
設(shè)置紋理s,t,r坐標(biāo)的尋址模式
enum class address { clamp_to_zero, clamp_to_edge, repeat, mirrored_repeat }
設(shè)置所有的紋理坐標(biāo)的尋址模式
enum class mip_filter { none, nearest, linear }
設(shè)置紋理采樣的mipMap過(guò)濾模式,如果是none,那么只有一層紋理生效
note:在Metal中初始化的采樣器必須使用constexpr修飾符修飾
例:
constexpr sampler s(coord::pixel, address::clamp_to_zero, filter::linear);