Ios 苹果金属存储器布局

Ios 苹果金属存储器布局,ios,metal,Ios,Metal,我在处理MPSImage的底层内存时遇到问题。我一直在使用MPSImage的texture成员变量上的getBytes和replace方法来读取和写入底层数据。问题是我找不到关于如何将内存解释为图像的文档(即行、列和通道的布局)。使问题复杂化的部分原因是,无论特征通道的数量如何,数据都存储为RGBA纹理切片的堆栈,某些通道可能未使用。例如,对于3个特征通道,将有一个RGBA纹理切片,并且一个通道的空间值将保持未使用状态 问题是,MPSImage数据实际上是如何在纹理中排列的?这似乎比我原先想象的

我在处理MPSImage的底层内存时遇到问题。我一直在使用MPSImage的
texture
成员变量上的
getBytes
replace
方法来读取和写入底层数据。问题是我找不到关于如何将内存解释为图像的文档(即行、列和通道的布局)。使问题复杂化的部分原因是,无论特征通道的数量如何,数据都存储为RGBA纹理切片的堆栈,某些通道可能未使用。例如,对于3个特征通道,将有一个RGBA纹理切片,并且一个通道的空间值将保持未使用状态

问题是,MPSImage数据实际上是如何在纹理中排列的?这似乎比我原先想象的要复杂得多

经过多次实验后,数据的排列似乎有所不同,这取决于特征通道的数量是<4还是>4。但我还是很难弄明白


有人能给我解释一下MPSImage数据布局吗?

前四个功能通道的编码方式与标准RGBA纹理相同。特征通道0处于“R”位置,特征通道1处于“G”位置,依此类推

接下来的四个特征通道作为texture2d_阵列中的下一个切片显示。如果您的100x100图像具有20个特征通道,则该图像将被编码为100x100纹理阵列,阵列中有(20/4=)5个切片

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