如何通过 Metal 在 iOS 上使用 GPU 和 CPU 之间的共享内存?(理想情况下目标c)

kar*_*rel 5 ios metal

我创建了一个像这样的 MTLTexture:

descTex=[MTLTextureDescriptor texture2DDescriptorWithPixelFormat:MTLPixelFormatRGBA8Unorm width:texCamWidth height:texCamHeight mipmapped:NO];
descTex.usage = MTLTextureUsageShaderWrite | MTLTextureUsageShaderRead ;
[descTex setStorageMode:MTLStorageModeShared];
texOutRGB = [_device newTextureWithDescriptor:descTex];
Run Code Online (Sandbox Code Playgroud)

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

MoD*_*oDJ 2

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