版本記錄
版本號 | 時(shí)間 |
---|---|
V1.0 | 2018.11.04 星期日 |
前言
很多做視頻和圖像的硫眨,相信對這個(gè)框架都不是很陌生憨闰,它渲染高級3D圖形,并使用GPU執(zhí)行數(shù)據(jù)并行計(jì)算嗓奢。接下來的幾篇我們就詳細(xì)的解析這個(gè)框架。感興趣的看下面幾篇文章浑厚。
1. Metal框架詳細(xì)解析(一)—— 基本概覽
2. Metal框架詳細(xì)解析(二) —— 器件和命令(一)
3. Metal框架詳細(xì)解析(三) —— 渲染簡單的2D三角形(一)
4. Metal框架詳細(xì)解析(四) —— 關(guān)于GPU Family 4(一)
5. Metal框架詳細(xì)解析(五) —— 關(guān)于GPU Family 4之關(guān)于Imageblocks(二)
6. Metal框架詳細(xì)解析(六) —— 關(guān)于GPU Family 4之關(guān)于Tile Shading(三)
7. Metal框架詳細(xì)解析(七) —— 關(guān)于GPU Family 4之關(guān)于光柵順序組(四)
8. Metal框架詳細(xì)解析(八) —— 關(guān)于GPU Family 4之關(guān)于增強(qiáng)的MSAA和Imageblock采樣覆蓋控制(五)
9. Metal框架詳細(xì)解析(九) —— 關(guān)于GPU Family 4之關(guān)于線程組共享(六)
10. Metal框架詳細(xì)解析(十) —— 基本組件(一)
11. Metal框架詳細(xì)解析(十一) —— 基本組件之器件選擇 - 圖形渲染的器件選擇(二)
12. Metal框架詳細(xì)解析(十二) —— 基本組件之器件選擇 - 計(jì)算處理的設(shè)備選擇(三)
13. Metal框架詳細(xì)解析(十三) —— 計(jì)算處理(一)
14. Metal框架詳細(xì)解析(十四) —— 計(jì)算處理之你好股耽,計(jì)算(二)
15. Metal框架詳細(xì)解析(十五) —— 計(jì)算處理之關(guān)于線程和線程組(三)
16. Metal框架詳細(xì)解析(十六) —— 計(jì)算處理之計(jì)算線程組和網(wǎng)格大小(四)
17. Metal框架詳細(xì)解析(十七) —— 工具钳幅、分析和調(diào)試(一)
18. Metal框架詳細(xì)解析(十八) —— 工具物蝙、分析和調(diào)試之Metal GPU Capture(二)
19. Metal框架詳細(xì)解析(十九) —— 工具、分析和調(diào)試之GPU活動(dòng)監(jiān)視器(三)
20. Metal框架詳細(xì)解析(二十) —— 工具敢艰、分析和調(diào)試之關(guān)于Metal著色語言文件名擴(kuò)展名诬乞、使用Metal的命令行工具構(gòu)建庫和標(biāo)記Metal對象和命令(四)
21. Metal框架詳細(xì)解析(二十一) —— 基本課程之基本緩沖區(qū)(一)
22. Metal框架詳細(xì)解析(二十二) —— 基本課程之基本紋理(二)
23. Metal框架詳細(xì)解析(二十三) —— 基本課程之CPU和GPU同步(三)
24. Metal框架詳細(xì)解析(二十四) —— 基本課程之參數(shù)緩沖 - 基本參數(shù)緩沖(四)
25. Metal框架詳細(xì)解析(二十五) —— 基本課程之參數(shù)緩沖 - 帶有數(shù)組和資源堆的參數(shù)緩沖區(qū)(五)
26. Metal框架詳細(xì)解析(二十六) —— 基本課程之參數(shù)緩沖 - 具有GPU編碼的參數(shù)緩沖區(qū)(六)
27. Metal框架詳細(xì)解析(二十七) —— 高級技術(shù)之圖層選擇的反射(一)
28. Metal框架詳細(xì)解析(二十八) —— 高級技術(shù)之使用專用函數(shù)的LOD(一)
29. Metal框架詳細(xì)解析(二十九) —— 高級技術(shù)之具有參數(shù)緩沖區(qū)的動(dòng)態(tài)地形(一)
30. Metal框架詳細(xì)解析(三十) —— 延遲照明(一)
31. Metal框架詳細(xì)解析(三十一) —— 在視圖中混合Metal和OpenGL渲染(一)
32. Metal框架詳細(xì)解析(三十二) —— Metal渲染管道教程(一)
33. Metal框架詳細(xì)解析(三十三) —— Metal渲染管道教程(二)
34. Metal框架詳細(xì)解析(三十四) —— Hello Metal! 一個(gè)簡單的三角形的實(shí)現(xiàn)(一)
35. Metal框架詳細(xì)解析(三十五) —— Hello Metal! 一個(gè)簡單的三角形的實(shí)現(xiàn)(二)
36. Metal框架詳細(xì)解析(三十六) —— Metal編程指南之概覽(一)
37. Metal框架詳細(xì)解析(三十七) —— Metal編程指南之基本Metal概念(二)
38. Metal框架詳細(xì)解析(三十八) —— Metal編程指南之命令組織和執(zhí)行模型(三)
Resource Objects: Buffers and Textures - 資源對象:緩沖區(qū)和紋理
本章介紹用于存儲(chǔ)未格式化內(nèi)存和格式化圖像數(shù)據(jù)的Metal資源對象(MTLResource)丽惭。 有兩種類型的MTLResource
對象:
- MTLBuffer表示可以包含任何類型數(shù)據(jù)的未格式化內(nèi)存的分配击奶。 緩沖區(qū)通常用于頂點(diǎn),著色器和計(jì)算狀態(tài)數(shù)據(jù)责掏。
-
MTLTexture表示具有指定紋理類型和像素格式的格式化圖像數(shù)據(jù)的分配柜砾。 紋理對象用作頂點(diǎn),片段或計(jì)算函數(shù)的源紋理换衬,以及存儲(chǔ)圖形渲染輸出(即作為
attachment
)痰驱。
本章還討論了MTLSamplerState對象。 雖然采樣器本身不是資源瞳浦,但在使用紋理對象執(zhí)行查找計(jì)算時(shí)會(huì)使用它們担映。
Buffers Are Typeless Allocations of Memory - 緩沖區(qū)是內(nèi)存的無類型分配
MTLBuffer對象表示可以包含任何類型數(shù)據(jù)的內(nèi)存分配。
1. Creating a Buffer Object - 創(chuàng)建緩沖區(qū)對象
以下MTLDevice方法創(chuàng)建并返回MTLBuffer對象:
-
newBufferWithLength:options:方法創(chuàng)建具有新存儲(chǔ)分配的
MTLBuffer
對象叫潦。 -
newBufferWithBytes:length:options:方法通過將數(shù)據(jù)從現(xiàn)有存儲(chǔ)(位于CPU地址指針)復(fù)制到新的存儲(chǔ)分配中來創(chuàng)建
MTLBuffer
對象蝇完。 -
newBufferWithBytesNoCopy:length:options:deallocator:方法創(chuàng)建具有現(xiàn)有存儲(chǔ)分配的
MTLBuffer
對象,并且不為此對象分配任何新存儲(chǔ)矗蕊。
所有緩沖區(qū)創(chuàng)建方法都具有輸入值length
短蜕,以指示存儲(chǔ)分配的大小(以字節(jié)為單位)傻咖。所有方法還接受MTLResourceOptions
對象朋魔,以獲取可以修改創(chuàng)建的緩沖區(qū)行為的options
。如果options
的值為0卿操,則默認(rèn)值用于資源選項(xiàng)警检。
2. Buffer Methods - 緩沖方法
MTLBuffer協(xié)議具有以下方法:
- contents方法返回緩沖區(qū)存儲(chǔ)分配的CPU地址。
- newTextureWithDescriptor:offset:bytesPerRow:方法創(chuàng)建一種特殊的紋理對象害淤,引用緩沖區(qū)的數(shù)據(jù)扇雕。 Creating a Texture Object中詳細(xì)介紹了此方法。
Textures Are Formatted Image Data - 紋理是格式化圖像數(shù)據(jù)
MTLTexture對象表示格式化圖像數(shù)據(jù)的分配窥摄,可以將其用作頂點(diǎn)著色器憎瘸,片段著色器或計(jì)算函數(shù)的資源勋磕,或者用作要用作渲染目標(biāo)的attachment
杨赤。 MTLTexture
對象可以具有以下結(jié)構(gòu)之一:
- 1D堕扶,2D或3D圖像
- 一維或一維2D圖像
- 六個(gè)2D圖像的立方體
MTLPixelFormat
指定MTLTexture
對象中各個(gè)像素的組織南用。像素格式在Pixel Formats for Textures中進(jìn)一步討論萨赁。
1. Creating a Texture Object - 創(chuàng)建紋理對象
以下方法創(chuàng)建并返回MTLTexture對象:
-
newTextureWithDescriptor:方法使用MTLTextureDescriptor對象創(chuàng)建一個(gè)具有紋理圖像數(shù)據(jù)的新存儲(chǔ)分配的
MTLTexture
對象來描述紋理的屬性鞭呕。 -
MTLTexture
的newTextureViewWithPixelFormat:方法創(chuàng)建一個(gè)MTLTexture
對象文捶,該對象與調(diào)用MTLTexture對象共享相同的存儲(chǔ)分配吱瘩。由于它們共享相同的存儲(chǔ)空間道伟,因此對新紋理對象的像素的任何更改都會(huì)反映在調(diào)用紋理對象中,反之亦然。對于新創(chuàng)建的紋理蜜徽,newTextureViewWithPixelFormat:方法重新解釋調(diào)用MTLTexture
對象的存儲(chǔ)分配的現(xiàn)有紋理圖像數(shù)據(jù)祝懂,就好像數(shù)據(jù)以指定的像素格式存儲(chǔ)一樣。新紋理對象的MTLPixelFormat
必須與原始紋理對象的MTLPixelFormat
兼容拘鞋。 (有關(guān)普通砚蓬,壓縮和壓縮像素格式的詳細(xì)信息,請參閱Pixel Formats for Textures盆色。) -
MTLBuffer
的newTextureWithDescriptor:offset:bytesPerRow:方法創(chuàng)建一個(gè)MTLTexture
對象灰蛙,該對象共享調(diào)用MTLBuffer對象的存儲(chǔ)分配作為其紋理圖像數(shù)據(jù)。由于它們共享相同的存儲(chǔ)隔躲,因此對新紋理對象的像素的任何更改都會(huì)反映在調(diào)用紋理對象中摩梧,反之亦然。在紋理和緩沖區(qū)之間共享存儲(chǔ)可以防止使用某些紋理優(yōu)化宣旱,例如像素調(diào)整或平鋪仅父。
2. Creating a Texture Object with a Texture Descriptor - 使用紋理描述符創(chuàng)建紋理對象
MTLTextureDescriptor定義用于創(chuàng)建MTLTexture對象的屬性,包括其圖像大谢胍鳌(寬度笙纤,高度和深度),像素格式买置,排列(數(shù)組或多維數(shù)據(jù)集類型)和mipmap
數(shù)粪糙。 MTLTextureDescriptor
屬性僅在創(chuàng)建MTLTexture
對象期間使用。創(chuàng)建MTLTexture
對象后忿项,其MTLTextureDescriptor
對象中的屬性更改不再對該紋理產(chǎn)生任何影響蓉冈。
要從描述符創(chuàng)建一個(gè)或多個(gè)紋理:
-
1) 創(chuàng)建一個(gè)自定義MTLTextureDescriptor對象,其中包含描述紋理數(shù)據(jù)的紋理屬性:
- textureType屬性指定紋理的維度和排列(例如轩触,數(shù)組或多維數(shù)據(jù)集)寞酿。
-
width, height和depth屬性指定基級紋理
mipmap
的每個(gè)維度中的像素大小。 - pixelFormat屬性指定像素在紋理中的存儲(chǔ)方式脱柱。
- arrayLength屬性指定MTLTextureType1DArray或MTLTextureType2DArray類型紋理對象的數(shù)組元素?cái)?shù)伐弹。
-
mipmapLevelCount屬性指定
mipmap
級別的數(shù)量。 - sampleCount屬性指定每個(gè)像素中的樣本數(shù)榨为。
- resourceOptions屬性指定其內(nèi)存分配的行為惨好。
2) 通過調(diào)用
MTLDevice
對象的newTextureWithDescriptor:方法從MTLTextureDescriptor
對象創(chuàng)建紋理。在紋理創(chuàng)建之后随闺,調(diào)用replaceRegion:mipmapLevel:slice:withBytes:bytesPerRow:bytesPerImage:加載紋理圖像數(shù)據(jù)的方法日川,詳見Copying Image Data to and from a Texture。3) 要?jiǎng)?chuàng)建更多
MTLTexture
對象矩乐,可以重用相同的MTLTextureDescriptor
對象龄句,根據(jù)需要修改描述符的屬性值回论。
Listing 3-1
顯示了用于創(chuàng)建紋理描述符txDesc
并為3D
,64x64x64
紋理設(shè)置其屬性的代碼分歇。
// Listing 3-1 Creating a Texture Object with a Custom Texture Descriptor
MTLTextureDescriptor* txDesc = [[MTLTextureDescriptor alloc] init];
txDesc.textureType = MTLTextureType3D;
txDesc.height = 64;
txDesc.width = 64;
txDesc.depth = 64;
txDesc.pixelFormat = MTLPixelFormatBGRA8Unorm;
txDesc.arrayLength = 1;
txDesc.mipmapLevelCount = 1;
id <MTLTexture> aTexture = [device newTextureWithDescriptor:txDesc];
3. Working with Texture Slices - 使用紋理切片
切片(slice)
是單個(gè)1D傀蓉,2D或3D紋理圖像及其所有關(guān)聯(lián)的mipmap
。對于每個(gè)切片:
- 基準(zhǔn)級別
mipmap
的大小由MTLTextureDescriptor
對象的width
职抡,height
和depth
屬性指定葬燎。 -
mipmap
級別i
的縮放尺寸由max(1,floor(width / 2i))x max(1繁调,floor(height / 2i))x max(1萨蚕,floor(depth / 2i))
指定。最大mipmap
級別是第一個(gè)mipmap
級別蹄胰,其中實(shí)現(xiàn)了1 x 1 x 1
的大小岳遥。 - 一個(gè)切片中的
mipmap
級別的數(shù)量可以由floor(log2(max(width,height裕寨,depth)))+ 1
確定浩蓉。
所有紋理對象至少有一個(gè)切片;立方體和數(shù)組紋理類型可能有多個(gè)切片宾袜。在寫入和讀取在紋理中復(fù)制圖像數(shù)據(jù)和Copying Image Data to and from a Texture中討論的紋理圖像數(shù)據(jù)的方法中捻艳,slice
是從零開始的輸入值。對于1D庆猫,2D或3D紋理认轨,只有一個(gè)切片,因此切片的值必須為0月培。立方體紋理具有6個(gè)總2D切片嘁字,從0到5尋址。對于1DArray
和2DArray
紋理類型杉畜,每個(gè)數(shù)組element
代表一個(gè)切片纪蜒。例如,對于arrayLength = 10
的2DArray
紋理類型此叠,總共有10個(gè)切片纯续,從0到9尋址。要從整體紋理結(jié)構(gòu)中選擇單個(gè)1D灭袁,2D或3D圖像猬错,首先選擇切片,然后選擇該切片中的mipmap
級別茸歧。
4. Creating a Texture Descriptor with Convenience Methods - 使用便捷方法創(chuàng)建紋理描述符
對于常見的2D和立方體紋理兔魂,請使用以下便捷方法創(chuàng)建MTLTextureDescriptor
對象,并自動(dòng)設(shè)置其若干屬性值:
-
texture2DDescriptorWithPixelFormat:width:height:mipmapped:方法為2D紋理創(chuàng)建
MTLTextureDescriptor
對象举娩。width
和height
值定義2D紋理的尺寸。type
屬性自動(dòng)設(shè)置為MTLTextureType2D
,depth
和arrayLength
設(shè)置為1铜涉。 -
textureCubeDescriptorWithPixelFormat:size:mipmapped:方法為立方體紋理創(chuàng)建
MTLTextureDescriptor
對象智玻,其中type
屬性設(shè)置為MTLTextureTypeCube
,width
和height
設(shè)置為size
芙代,depth
和arrayLength
設(shè)置為1吊奢。
兩種MTLTextureDescriptor
便捷方法都接受輸入值pixelFormat
,它定義紋理的像素格式纹烹。兩種方法也接受mipmapped
的輸入值页滚,該值確定紋理圖像是否是mipmapped
。 (如果mipmapped
為YES铺呵,則紋理被mipmap
處理裹驰。)
Listing 3-2
使用texture2DDescriptorWithPixelFormat:width:height:mipmapped:
方法為未mipmapped
的64x64 2D
紋理創(chuàng)建描述符對象。
Listing 3-2 Creating a Texture Object with a Convenience Texture Descriptor
MTLTextureDescriptor *texDesc = [MTLTextureDescriptor
texture2DDescriptorWithPixelFormat:MTLPixelFormatBGRA8Unorm
width:64 height:64 mipmapped:NO];
id <MTLTexture> myTexture = [device newTextureWithDescriptor:texDesc];
5. Copying Image Data to and from a Texture - 將圖像數(shù)據(jù)復(fù)制到紋理和從紋理復(fù)制
要將圖像數(shù)據(jù)同步復(fù)制到MTLTexture
對象的存儲(chǔ)分配中或從中復(fù)制數(shù)據(jù)片挂,請使用以下方法:
-
replaceRegion:mipmapLevel:slice:withBytes:bytesPerRow:bytesPerImage:將來自調(diào)用者指針的像素?cái)?shù)據(jù)區(qū)域復(fù)制到指定紋理切片的存儲(chǔ)分配的一部分中幻林。replaceRegion:mipmapLevel:withBytes:bytesPerRow:是一種類似的便捷方法,它將像素?cái)?shù)據(jù)區(qū)域復(fù)制到默認(rèn)切片中音念,假設(shè)切片相關(guān)參數(shù)的默認(rèn)值(即
slice = 0
和bytesPerImage = 0
)沪饺。 -
getBytes:bytesPerRow:bytesPerImage:fromRegion:mipmapLevel:slice:
從指定的紋理切片中檢索像素?cái)?shù)據(jù)的區(qū)域。 getBytes:bytesPerRow:fromRegion:mipmapLevel:是一種類似的便捷方法闷愤,它從默認(rèn)切片中檢索像素?cái)?shù)據(jù)的區(qū)域整葡,假設(shè)切片相關(guān)參數(shù)的默認(rèn)值(slice = 0
和bytesPerImage = 0
)。
Listing 3-3
顯示了如何調(diào)用replaceRegion:mipmapLevel:slice:withBytes:bytesPerRow:bytesPerImage:從系統(tǒng)內(nèi)存中的源數(shù)據(jù)指定紋理圖像讥脐,textureData
遭居,在切片0
和mipmap
級別0。
// Listing 3-3 Copying Image Data into the Texture
// pixelSize is the size of one pixel, in bytes
// width, height - number of pixels in each dimension
NSUInteger myRowBytes = width * pixelSize;
NSUInteger myImageBytes = rowBytes * height;
[tex replaceRegion:MTLRegionMake2D(0,0,width,height)
mipmapLevel:0 slice:0 withBytes:textureData
bytesPerRow:myRowBytes bytesPerImage:myImageBytes];
6. Pixel Formats for Textures - 紋理的像素格式
MTLPixelFormat
指定MTLTexture
對象的各個(gè)像素中的顏色攘烛,深度和模板數(shù)據(jù)存儲(chǔ)的組織魏滚。有三種像素格式:ordinary, packed, and compressed
。
-
Ordinary
格式只有常規(guī)的8位坟漱,16位或32位顏色分量鼠次。每個(gè)組件都安排在增加的內(nèi)存地址中,第一個(gè)列出的組件位于最低地址芋齿。例如腥寇,MTLPixelFormatRGBA8Unorm是32位格式,每個(gè)顏色分量有8位觅捆;最低地址包含紅色赦役,下一個(gè)地址包含綠色,依此類推栅炒。相反掂摔,對于MTLPixelFormatBGRA8Unorm术羔,最低地址包含藍(lán)色,下一個(gè)地址包含綠色乙漓,依此類推级历。 -
Packed
格式將多個(gè)組件組合成一個(gè)16位或32位值,其中組件從最低位到最高位(LSB到MSB)存儲(chǔ)叭披。例如寥殖,MTLPixelFormatRGB10A2Uint是一種32位打包格式,由三個(gè)10位通道(R涩蜘,G和B)和兩位alpha
組成嚼贡。 -
Compressed
格式以像素塊排列,每個(gè)塊的布局特定于該像素格式同诫。壓縮像素格式只能用于2D粤策,2D陣列或立方體紋理類型。壓縮格式不能用于創(chuàng)建1D
剩辟,2DMultisample
或3D
紋理掐场。
MTLPixelFormatGBGR422和MTLPixelFormatBGRG422是特殊的像素格式,用于存儲(chǔ)YUV
顏色空間中的像素贩猎。這些格式僅支持2D紋理(但不包括2D數(shù)組熊户,也不支持立方體類型),沒有mipmaps
和均勻width
吭服。
多種像素格式存儲(chǔ)具有sRGB
顏色空間值的顏色分量(例如嚷堡,MTLPixelFormatRGBA8Unorm_sRGB或MTLPixelFormatETC2_RGB8_sRGB)。當(dāng)采樣操作引用具有sRGB
像素格式的紋理時(shí)艇棕,Metal
實(shí)現(xiàn)會(huì)在采樣操作發(fā)生之前將sRGB
顏色空間分量轉(zhuǎn)換為線性顏色空間蝌戒。從sRGB組件S
到線性組件L
的轉(zhuǎn)換如下:
如果S <= 0.04045,則L = S / 12.92
如果S> 0.04045沼琉,則L =((S + 0.055)/1.055)2.4
相反北苟,當(dāng)渲染為使用具有sRGB
像素格式的紋理的顏色可渲染附件時(shí),實(shí)現(xiàn)將線性顏色值轉(zhuǎn)換為sRGB打瘪,如下所示:
如果L <= 0.0031308友鼻,則S = L * 12.92
如果L> 0.0031308,則S =(1.055 * L0.41667) - 0.055
有關(guān)用于渲染的像素格式的更多信息闺骚,請參閱Creating a Render Pass Descriptor彩扔。
Creating a Sampler States Object for Texture Lookup - 為紋理查找創(chuàng)建采樣器狀態(tài)對象
MTLSamplerState對象定義在圖形或計(jì)算函數(shù)對MTLTexture
對象執(zhí)行紋理采樣操作時(shí)使用的尋址,過濾和其他屬性僻爽。采樣器描述符定義采樣器狀態(tài)對象的屬性虫碉。要?jiǎng)?chuàng)建采樣器狀態(tài)對象:
- 調(diào)用MTLDevice對象的newSamplerStateWithDescriptor:方法以創(chuàng)建MTLSamplerDescriptor對象。
- 在
MTLSamplerDescriptor
對象中設(shè)置所需的值胸梆,包括過濾選項(xiàng)敦捧,尋址模式须板,最大各向異性和細(xì)節(jié)級別參數(shù)。 - 通過調(diào)用創(chuàng)建描述符的
MTLDevice
對象的newSamplerStateWithDescriptor:方法兢卵,從采樣器描述符創(chuàng)建MTLSamplerState對象逼纸。
您可以重用sampler
描述符對象來創(chuàng)建更多MTLSamplerState
對象,根據(jù)需要修改描述符的屬性值济蝉。描述符的屬性僅在對象創(chuàng)建期間使用。創(chuàng)建采樣器狀態(tài)后菠发,更改其描述符中的屬性不再對該采樣器狀態(tài)產(chǎn)生影響王滤。
Listing 3-4
是一個(gè)代碼示例,它創(chuàng)建MTLSamplerDescriptor
并對其進(jìn)行配置以創(chuàng)建MTLSamplerState滓鸠。為描述符對象的過濾器和地址模式屬性設(shè)置非默認(rèn)值雁乡。然后newSamplerStateWithDescriptor:方法使用sampler
描述符來創(chuàng)建一個(gè)采樣器狀態(tài)對象
Listing 3-4 Creating a Sampler State Object
// create MTLSamplerDescriptor
MTLSamplerDescriptor *desc = [[MTLSamplerDescriptor alloc] init];
desc.minFilter = MTLSamplerMinMagFilterLinear;
desc.magFilter = MTLSamplerMinMagFilterLinear;
desc.sAddressMode = MTLSamplerAddressModeRepeat;
desc.tAddressMode = MTLSamplerAddressModeRepeat;
// all properties below have default values
desc.mipFilter = MTLSamplerMipFilterNotMipmapped;
desc.maxAnisotropy = 1U;
desc.normalizedCoords = YES;
desc.lodMinClamp = 0.0f;
desc.lodMaxClamp = FLT_MAX;
// create MTLSamplerState
id <MTLSamplerState> sampler = [device newSamplerStateWithDescriptor:desc];
Maintaining Coherency Between CPU and GPU Memory - 保持CPU和GPU內(nèi)存之間的一致性
CPU和GPU都可以訪問MTLResource對象的底層存儲(chǔ)。但是糜俗,GPU與主機(jī)CPU異步操作踱稍,因此在使用主機(jī)CPU訪問這些資源的存儲(chǔ)時(shí)請記住以下幾點(diǎn)。
執(zhí)行MTLCommandBuffer對象時(shí)悠抹,MTLDevice對象僅保證觀察主機(jī)CPU對該MTLCommandBuffer
對象引用的任何MTLResource
對象的存儲(chǔ)分配所做的任何更改珠月,如果(并且僅當(dāng))主機(jī)CPU在MTLCommandBuffer
對象已提交之前進(jìn)行了這些更改。也就是說楔敌,MTLDevice
對象可能不會(huì)觀察到在提交相應(yīng)的MTLCommandBuffer
對象之后主機(jī)CPU所做的資源的更改(即啤挎,MTLCommandBuffer
對象的status屬性是MTLCommandBufferStatusCommitted)。
類似地卵凑,在MTLDevice
對象執(zhí)行MTLCommandBuffer
對象之后庆聘,如果命令緩沖區(qū)已完成執(zhí)行(即MTLCommandBuffer
對象的status
屬性是MTLCommandBufferStatusCompleted),則主機(jī)CPU僅保證觀察MTLDevice對象對該命令緩沖區(qū)引用的任何資源的存儲(chǔ)分配所做的任何更改 )勺卢。
后記
本篇主要講述了Metal編程指南之資源對象:緩沖區(qū)和紋理伙判,感興趣的給個(gè)贊或者關(guān)注~~~