将 Metal 帧缓冲区复制到具有不同像素格式的 MTLTexture

Copy Metal frame buffer to MTLTexture with different Pixel Format

我需要将屏幕像素抓取到纹理中以执行 post 处理。 以前,我一直在使用 BlitCommandEncoder 从一个纹理复制到另一个纹理。源纹理是 MTLDrawable 纹理,到我的目标纹理上。它们都有相同的 MTLPixelFormatBGRA8Unorm,所以一切正常。

但是,现在我需要使用 MTLPixelFormatRGBA16Float 的帧缓冲区颜色附件纹理进行 HDR 渲染。所以,当我抓取屏幕像素时,我实际上是从这个颜色附件纹理而不是 Drawable 纹理中抓取。我收到此错误:

[MTLDebugBlitCommandEncoder internalValidateCopyFromTexture:sourceSlice:sourceLevel:sourceOrigin:sourceSize:toTexture:destinationSlice:destinationLevel:destinationOrigin:options:]:447: 断言失败 [sourceTexture pixelFormat](MTLPixelFormatRGBA16Float) 必须等于 [destinationTexture pixelFormat](MTLPixelFormatBGRA8Unorm)

我认为我不需要将目标纹理更改为 RGBA16Float 格式?因为那样会占用双倍的内存。一个具有该格式的全屏纹理(颜色附件)应该足以让 HDR 正常工作吧?

有没有其他方法可以成功执行这种复制? 在 openGL 上使用 glCopyTexImage2D

复制时没有错误

Metal 在渲染过程中自动从源格式转换为目标格式。所以你可以只做一个无操作渲染过程来执行转换。

或者,如果您想避免样板式无操作渲染代码,您可以使用基本上做同样事情的MPSImageConversion性能着色器。