如果“金属原点”位于左上角,为什么此图像在左下角显示?

时间:2019-12-28 13:44:16

标签: metal compute-shader

我正在获取与该问题中的图像相同的图像:

Confused about thread_position_in_grid

深黑色在左下角,这意味着gid.xgid.y都在图像的该部分中0。然而,Metal文档(以及类似答案:What is the coordinate system used in metal?)指出,原点位于左上角,这意味着应该在其中看到深黑色的角。

为什么似乎不是这样?

我使用CoreImage查看纹理。我像这样制作CIImage

CIImage(mtlTexture: kernelOutputTexture,
                       options: [CIImageOption.colorSpace: colorSpace])!

然后我像这样在NSImageView中查看它:

let rep = NSCIImageRep(ciImage: image)
let nsImage = NSImage(size: rep.size)
nsImage.addRepresentation(rep)

1 个答案:

答案 0 :(得分:0)

Core Image使用坐标系,其原点位于图像的左下角。尽管您可能会怀疑在包装MTLTexture时它将解释Metal的左上角原点,但事实并非如此。

要创建一个与原始纹理的方向匹配的CIImage,可以请求已垂直翻转的新图像:

image = image.transformed(by: image.orientationTransform(for: .downMirrored))

orientationTransform(for:)方法是iOS 11.0中引入的 和macOS 10.13。使用它可能比编写自己的仿射变换更鲁棒,并且效率也很高,因为Core Image使用惰性评估,而不是物理移动或复制基础数据。