美文网首页
关于Metal贴图上下颠倒的解决方法

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

作者: chocoford | 来源:发表于2018-05-01 12:58 被阅读0次

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

    相关文章

      网友评论

          本文标题:关于Metal贴图上下颠倒的解决方法

          本文链接:https://www.haomeiwen.com/subject/edvxrftx.html