Apple Metal MPSImage内存布局

时间:2017-01-17 21:06:36

标签: ios metal

我在处理MPSImage的底层内存时遇到问题。我一直在MPSImage的Result成员变量上使用方法getBytesreplace来读取和写入基础数据。问题是我无法找到如何将内存解释为图像的文档(即行,列和通道的布局方式)。使问题复杂化的部分原因在于,无论特征通道的数量如何,数据都存储为RGBA纹理切片的堆栈,其中一些通道​​可能未被使用。例如,有3个特征通道,将有一个RGBA纹理切片,并且一个通道的空间将被闲置。

问题是,MPSImage数据如何在纹理中实际排列?它似乎比我原先猜到的要复杂得多。

经过多次实验,似乎数据的排列方式不同,具体取决于特征通道的数量是否为< 4或>但是我仍然无法搞清楚。

任何人都可以向我解释MPSImage数据布局吗?

1 个答案:

答案 0 :(得分:1)

前四个特征通道的编码与标准RGBA纹理相同。特征通道0位于" R"位置,特征通道1位于" G"位置等等。

接下来的四个要素通道作为texture2d_array中的下一个切片出现。如果您有一个带有20个特征通道的100x100图像,则会将其编码为100x100纹理阵列,阵列中有(20/4 =)5个切片。

为了使问题更复杂,您可以让MPSImage阵列中包含多个图像,每个图像都有4个以上的特征通道。这通常被称为批处理。第二个图像位于第一个图像之后的纹理数组中。如果我们在MPSImage中有多个100x100x20图像,那么第二个图像从切片5开始,第三个图像从切片10开始,依此类推。