我在处理 MPSImage 的底层内存时遇到问题。我一直在 MPSImage 的 texture
成员变量上使用方法 getBytes
和 replace
来读取和写入底层数据。问题是我找不到有关如何将内存解释为图像的文档(即行、列和 channel 的布局方式)。使问题复杂化的部分原因是,无论特征 channel 的数量如何,数据都存储为一堆 RGBA 纹理切片,其中一些 channel 可能未被使用。例如,如果有 3 个特征 channel ,将有一个 RGBA 纹理切片,一个 channel 的空间将被闲置。
问题是,MPSImage 数据在纹理中实际上是如何排列的?这似乎比我最初猜测的要复杂。
经过多次实验,似乎数据的排列方式有所不同,具体取决于特征 channel 的数量是 < 4 还是 > 4。但我仍然无法弄明白。
谁能给我解释一下 MPSImage 数据布局?
最佳答案
前四个特征 channel 的编码方式与标准 RGBA 纹理的编码方式相同。特征 channel 0 处于“R”位置,特征 channel 1 处于“G”位置,依此类推。
接下来的四个特征 channel 作为 texture2d_array 中的下一个切片出现。如果你有一张 100x100 的图像和 20 个特征 channel ,这将被编码为一个 100x100 的纹理数组,数组中有 (20/4=) 5 个切片。
为了使事情变得更复杂,您可以使用包含多个图像的 MPSImage 数组,每个图像具有超过 4 个特征 channel 。这通常称为批处理。第二张图像紧跟在第一张图像之后的纹理数组中。如果我们在 MPSImage 中有多个 100x100x20 图像,那么第二个图像从切片 5 开始,第三个图像从切片 10 开始,依此类推。
关于ios - Apple Metal MPSImage 内存布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41706987/