由于传统贴图的原点坐标是左下角,而Metal在左上角,导致应用传统贴图会出现问题。
其实就是用CoreGraphics把贴图翻转一下
因为UIImage转CGImage有直接现成的方法,没有什么难度。所以只分享下Mac端的解决方法。
通过CGImageSource
而非NSImage.CGImage
方法,如下:
func flipImage(_ url: String) -> CGImage {
let imageSource = CGImageSourceCreateWithURL(Bundle.main.resourceURL!.appendingPathComponent(url) as CFURL, nil)!
let imageRef = CGImageSourceCreateImageAtIndex(imageSource, 0, nil)!
let pixelsWidth = imageRef.width
let pixelsHeight = imageRef.height
let bitmapBytesPerRow = imageRef.bitsPerPixel * pixelsWidth
let bitmapByteCount = pixelsHeight * bitmapBytesPerRow
let bitmapData = calloc(bitmapByteCount, MemoryLayout<UInt8>.size)
let colorSpace = imageRef.colorSpace!
let ctx = CGContext.init(data: bitmapData,
width: pixelsWidth,
height: pixelsHeight,
bitsPerComponent: imageRef.bitsPerComponent,
bytesPerRow: bitmapBytesPerRow,
space: colorSpace,
bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue)!
ctx.translateBy(x: 0, y: CGFloat(pixelsHeight))
ctx.scaleBy(x: 1, y: -1)
ctx.draw(imageRef, in: CGRect.init(x: 0, y: 0, width: pixelsWidth, height: pixelsHeight))
return ctx.makeImage()!
}
-----------------------------------肥肠尴尬的分割线------------------------------
2018.6.22更,原来MetalKit中已经对这个功能有封装了。。。
在Textureloader中可以对贴图设置一系列属性,其中就有是否翻转的选项。