关于Metal贴图上下颠倒的解决方法

2018-05-01  本文已影响0人  chocoford

由于传统贴图的原点坐标是左下角,而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中可以对贴图设置一系列属性,其中就有是否翻转的选项。

上一篇下一篇

猜你喜欢

热点阅读