首页 > 解决方案 > 如何使用 Metal 在 iOS 上的 GPU 和 CPU 之间使用共享内存?(理想情况下与目标 c)

问题描述

我创建了一个这样的 MTLTexture:

descTex=[MTLTextureDescriptor texture2DDescriptorWithPixelFormat:MTLPixelFormatRGBA8Unorm width:texCamWidth height:texCamHeight mipmapped:NO];
descTex.usage = MTLTextureUsageShaderWrite | MTLTextureUsageShaderRead ;
[descTex setStorageMode:MTLStorageModeShared];
texOutRGB = [_device newTextureWithDescriptor:descTex];

使用计算着色器填充纹理并将其渲染到屏幕上。结果符合预期。现在我需要做一个 CPU 挂钩来修改不能用着色器完成的纹理数据。我希望 MTLTexture.buffer 内容可以让我遍历像素,但它似乎不像那样工作。我看到人们使用 getBytes 然后 replaceRegion 将其写回,但这看起来不像使用共享内存,因为制作了数据副本。如何使用 CPU 循环遍历纹理中的 RGBA 像素数据?

标签: iosmetal

解决方案


如果您创建了一个简单的一维缓冲区,则只需将内容成员作为指针访问。如果您需要一个 RGBA 缓冲区,然后创建一个包含 BGRA 像素的 CVPixelBuffer,您可以通过锁定访问像素,然后读取/写入缓冲区的基本指针(注意尊重行宽),最后您可以包装 CVPixelBuffer作为金属纹理来避免 memcpy()。2D 处理并非微不足道,仅使用 1D 缓冲区要容易得多。


推荐阅读