ios - 如何使用 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 像素数据?
解决方案
如果您创建了一个简单的一维缓冲区,则只需将内容成员作为指针访问。如果您需要一个 RGBA 缓冲区,然后创建一个包含 BGRA 像素的 CVPixelBuffer,您可以通过锁定访问像素,然后读取/写入缓冲区的基本指针(注意尊重行宽),最后您可以包装 CVPixelBuffer作为金属纹理来避免 memcpy()。2D 处理并非微不足道,仅使用 1D 缓冲区要容易得多。
推荐阅读
- dataweave - 在 Mulesoft 中将一种 XML 格式转换为另一种 XML 格式
- save - 如何将文件保存到服务器:PhpSpreadsheet
- r - 如何访问 Shiny renderUI 中的输出,并将它们写入多个 .csv / .zip
- javascript - 在threejs中设置缓冲区几何顶点颜色而不是颜色的透明度
- javascript - 将 HTML 中的 JavaScript 变量作为 Liquid 模板的一部分呈现
- azure-cosmosdb - 运行 ORDER BY r._ts DSEC CosmosDB 时,标头中缺少 x-ms-continuation
- python - 如果来自一列的数据存在于另一列中,则合并两个数据框
- android - 尝试使用Docusign依赖构建Android时出现重复的类错误
- gatling - Gatling - 如何设置循环用户?
- c - 分配 var = 0.0 时程序退出;