Metal語(yǔ)言規(guī)范

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ì)于指針使用的限制
  1. 函數(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);
?著作權(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ù)。

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