我创建了这样的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像素数据?
答案 0 :(得分:2)
如果您创建了一个简单的1D缓冲区,则只需访问content成员作为指针即可。如果需要RGBA缓冲区,然后创建一个包含BGRA像素的CVPixelBuffer,则可以通过锁定来访问像素,然后对该缓冲区的基本指针进行读/写操作(请注意行宽),最后可以包装CVPixelBuffer作为金属质感以避免memcpy()。 2D处理并非易事,仅使用1D缓冲区要容易得多。
答案 1 :(得分:0)
您试图做的事仅在macOS上可行。
macOS实现了托管模式,该模式定义了同步内存 配对一个资源,一个副本在系统内存中,另一个副本在 显存。托管资源受益于快速的CPU和GPU访问 到资源的每个副本,只需最少的API调用即可 同步这些副本。