ios - Apple Metal MPSImage 内存布局

标签 ios metal

我在处理 MPSImage 的底层内存时遇到问题。我一直在 MPSImage 的 texture 成员变量上使用方法 getBytesreplace 来读取和写入底层数据。问题是我找不到有关如何将内存解释为图像的文档(即行、列和 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/

相关文章:

ios - 如果 `MPSCNNConvolutionDataSource` 协议(protocol)的 `load` 方法返回 false 会发生什么?

metal - 显性释放 Metal 质感

javascript - 未触发 IOS 页隐藏。无法检测页面卸载

ios - 使用未声明的类型 'NSXMLElement' 错误

ios - Xcode Storyboard - 使用很棒的字体制作文本 RTL

ios - observeValueForKeyPath 在 swift 中崩溃应用程序

ios - 使用 Metal 的旧设备上的内存使用量不断上升

ios - 我们可以限制 Swift 生成的接口(interface)只能在 Xcode 中从模块访问吗?

ios - 为 iOS Metal 中的 MTLBuffer 使用的数据分配内存

ios - Metal 着色器纹理读取与样本